标签:
Description
Input
Output
Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1
Sample Output
14
题目大意:有n堆物品,物品有各自的价值和重量,问怎样在装满背包的时候使得背包内的物品价值最高。
解题思路:一开始的时候我是想到的排序方法,用2维数组去求,但是当我查了下网上资料后,发现还有另外一种方法
,就是状态转移:f[j]=max{f[j],f[j-b[i].volume]+b[i].value}
具体方法可以在代码里面看:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 6 using namespace std; 7 8 9 struct things 10 { 11 int h; 12 int v; 13 }goods[1005]; 14 15 int max(int a,int b) 16 { 17 return a>b?a:b; 18 } 19 20 21 int main() 22 { 23 int t; 24 int n,v,l; 25 int dp[1005]; 26 scanf("%d",&t); 27 while(t--) 28 { 29 scanf("%d%d",&n,&v); 30 int i; 31 for(i = 1;i<=n;i++) 32 scanf("%d",&goods[i].h); 33 for(i = 1;i<=n;i++) 34 scanf("%d",&goods[i].v); 35 memset(dp,0,sizeof(dp)); 36 for(i = 1;i<=n;i++) 37 { 38 for(l = v;l>=goods[i].v;l--) 39 dp[l] = max(dp[l],dp[l-goods[i].v]+goods[i].h); 40 } 41 42 printf("%d\n",dp[v]); 43 } 44 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/shadervio/p/5744415.html