DP地狱训练 打包

1258: [DP地狱训练]打包

时间限制: 1 Sec  内存限制: 64 MB
提交: 379  解决: 220
[提交][状态][讨论版]

题目描述

你现在拿到了许多的礼物,你要把这些礼物放进袋子里。你只有一个最多装下V 体积物品的袋子,你不能全部放进去。你也拿不动那么重的东西。你估计你能拿的最大重量为 G。现在你了解了每一个物品的完美值、重量和体积,你当然想让袋子中装的物品的完美值总和最大,你又得计划一下了。

输入

第一行:G 和 V 表示最大重量和体积。 第二行:N 表示拿到 N 件礼物。 第三到N+2行:每行3个数 Ti Gi Vi 表示各礼物的完美值、重量和体积

输出

输出共一个数,表示可能获得的最大完美值。

样例输入

6 5		
4		
10 2 2		
20 3 2
40 4 3
30 3 3

样例输出

50

提示

对于20%的数据 N,V,G,Ti,Vi,Gi≤10
对于50%的数据 N,V,G,Ti,Vi,Gi≤100
对于80%的数据 N,V,G,Ti,Vi,Gi≤300
80%到100%的数据是N,V,G,Ti,Vi,Gi≤380 的离散随机数据。

01背包多了一个限制,其实也没什么区别,再加一维就好。

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 #include 
 9 #include 
10  
11 using namespace std;
12  
13 /*
14   f[i][j][k] : 前i个物品使得重量不超过j,体积不超过k时最大的完美值。
15   f[i][j][k] = max { f[i - 1][j][k], f[i - 1][j - G[i]][k - V[i]] + T[i] }
16  */
17  
18 int G, V, n, t, g, v, f[2][400][400], p;
19  
20 int main(){
21   scanf("%d%d%d", &G, &V, &n);
22   for(int i = 1 ; i <= n ; i ++){
23     p ^= 1;
24     for(int j = G ; j >= 0 ; j --){
25       for(int k = V ; k >= 0 ; k --){
26         f[p][j][k] = f[p ^ 1][j][k];
27       }
28     }
29     scanf("%d%d%d", &t, &g, &v);
30     for(int j = G ; j >= g ; j --){
31       for(int k = V ; k >= v ; k --){
32         f[p][j][k] = max(f[p ^ 1][j][k], f[p ^ 1][j - g][k - v] + t);
33       }
34     }
35   }
36   printf("%d\n", f[p][G][V]);
37 }
View Code

 

转载于:https://www.cnblogs.com/KingSann/articles/7307184.html

你可能感兴趣的:(DP地狱训练 打包)