分組揹包
阿新 • • 發佈:2021-11-03
分組揹包模板
怎麼處理一組物品不重複放。其實很簡單,只需要把列舉組中物品的迴圈放到列舉揹包大小的迴圈下就行了。因為揹包dp需要揹包空間大小迴圈完一遍才能表示把一個物體放進去了。而在迴圈揹包空間的過程中列舉物品,就相當於只放一種物品。
#include<iostream> #include<cstring> #include<algorithm> #pragma warning(disable:4996) using namespace std; int v, n, t; int x; int g[205][205]; int i, j, k; int w[10001], z[10001]; int b[10001]; int dp[10001]; int main() { //freopen("D:\\oj_sample\\tongtian\\5.in", "r", stdin); cin >> v >> n; for (i = 1; i <= n; i++) { cin >> w[i] >> z[i] >> x; t = max(t, x); b[x]++; g[x][b[x]] = i; //對映 } for (i = 1; i <= t; i++) { for (j = v; j >= 0; j--) { for (k = 1; k <= b[i]; k++) { if (j >= w[g[i][k]]) { dp[j] = max(dp[j], dp[j - w[g[i][k]]] + z[g[i][k]]); } } } } cout << dp[v]; return 0; }