01背包,完全背包,多重背包,分组背包的使用条件以及代码模板
背包問題算是動態規劃中的入門題目了,背包問題有很多種。背包九講中講的很清楚,我就不班門弄斧了,針對幾種比較常見的背包問題,闡述一下它的使用前提和代碼模板。
 1.01背包問題
題目
 有N 件物品和一個容量為V 的背包。第i ii件物品的費用是w[i] ,價值是v[i],求將哪些物品裝入背包可使價值總和最大。
 這種基礎的01背包問題,一般有兩種代碼書寫規則,一種是二維數組,一種是一維數組。個人比較推薦一維數組,兩種數組,代碼書寫并不一樣。
 一維數組代碼如下:
二維數組代碼如下:
#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e3+100; int w[maxx]; int v[maxx]; int dp[maxx][maxx]; int n,m;int main() {scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d%d",&w[i],&v[i]);memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){for(int j=1;j<=m;j++)//這個是正序{if(w[i]<=j) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);else dp[i][j]=dp[i-1][j];}}cout<<dp[n-1][m]<<endl;return 0; }2.完全背包問題
題目
 有N種物品和一個容量為V的背包,每種物品都有無限件可用。第i種物品的費用是w[i],價值是v[i]。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
完全背包和01背包的區別是,每一種物品都可以無限取。
 代碼如下:
3.多重背包問題
題目
 有N種物品和一個容量為V的背包。第i種物品最多有p[i]件可用,每件費用是w[i],價值是v[i]。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
多重背包,每一種物品不是無限制取,而是有一個限制。
代碼如下:
 這個代碼是一個例題的代碼,[藍橋杯][算法提高VIP]貪吃的大嘴
4.分組背包問題
問題
 有N件物品和一個容量為V的背包。第i件物品的費用是w[i],價值是v[i]。這些物品被劃分為若干組,每組中的物品互相沖突,最多選一件。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。
代碼如下:
#include<bits/stdc++.h> using namespace std;const int maxx=2e3+100; int dp[maxx]; int v, n, t; int we[maxx], c[maxx]; vector<int>ve[maxx];int main() {int p;cin >> v >> n >> t;for(int i = 1; i <= n; i++){scanf("%d%d%d", &we[i], &c[i], &p);ve[p].push_back(i);}for(int i = 1; i <= t; i++)//注意三重循環的順序,第一層遍歷的是組數,第二層遍歷的是價值(倒序),第三層遍歷的是每一組的物品。{for(int j = v; j >= 0; j--){for(int k = 0; k < ve[i].size(); k++){int x = ve[i][k];if (j >= we[x]) dp[j] = max(dp[j], dp[j-we[x]]+c[x]);}}}printf("%d\n", dp[v]);return 0; }有什么不對的地方請大佬指針,謝謝~。
 努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的01背包,完全背包,多重背包,分组背包的使用条件以及代码模板的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Ram 证实首款电动皮卡将被命名为 Ra
 - 下一篇: 再不用装一堆软件了!Windows 11