前面的限制条件只有背包的重量一个,二维背包讲的是约束条件有两个。
给出背包的体积和能承受的重量,要求满足这两个条件的时候,价值最大。
状态转移方程:
dp[j][k]=max(dp[j][k],dp[j-v[i]][k-w[i]]+pay[i])
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1600; 4 int v[maxn],w[maxn],pay[maxn]; 5 ///v表示背包所占的体积,w表示重量看,pay表示价值 6 int dp[maxn][maxn]; 7 int n,c,l; ///n表示物品的个数,c表示体积,l表示重量 8 9 int main() 10 { 11 ios::sync_with_stdio(0); std::cin.tie(0); 12 int T; 13 while( cin >> T){ 14 while(T--){ 15 cin >> n >> c >> l; 16 memset( dp, 0, sizeof dp); 17 for(int i=1;i<=n;i++) 18 cin >> v[i] >> w[i] >> pay[i]; 19 20 for(int i=1;i<=n;i++){ 21 for(int j=c;j>0;j--){ 22 if(j<v[i]) break; 23 for(int k=l;k>0;k--){ 24 if(j>=v[i]&&k>=w[i]) 25 dp[j][k]=max(dp[j][k],dp[j-v[i]][k-w[i]]+pay[i]); 26 else break; 27 } 28 } 29 } 30 31 cout << dp[c][l] << endl; 32 } 33 } 34 return 0; 35 }