二维背包

  前面的限制条件只有背包的重量一个,二维背包讲的是约束条件有两个。

  给出背包的体积和能承受的重量,要求满足这两个条件的时候,价值最大。

  状态转移方程:

  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 }

 

posted @ 2018-05-15 18:11  flyer_duck  阅读(500)  评论(0编辑  收藏  举报