标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
题目要求是尽量装的最多,所以初始化的时候都为0即可。
如果要求恰好装满,初始化的时候除了dp[0] = 0,其他都要设成-inf,表示不合法情况。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int T; 4 int dp[1010][1010]; 5 int v[1010], w[1010]; 6 int main() 7 { 8 // freopen("in.txt", "r", stdin); 9 // freopen("out.txt", "w", stdout); 10 scanf("%d", &T); 11 while(T--) 12 { 13 int N, V; 14 scanf("%d%d", &N, &V); 15 memset(dp, 0, sizeof(dp)); 16 for(int i = 1; i <= N; i++) scanf("%d", &v[i]); 17 for(int i = 1; i <= N; i++) scanf("%d", &w[i]); 18 19 for(int i = 1; i <= N; i++) 20 { 21 for(int j = 0; j <= V; j++) 22 { 23 if(j >= w[i]) dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]); 24 else dp[i][j] = dp[i-1][j]; 25 } 26 } 27 printf("%d\n", dp[N][V]); 28 29 } 30 return 0; 31 }
滚动数组:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int T; 4 int dp[1010]; 5 int v[1010], w[1010]; 6 int main() 7 { 8 // freopen("in.txt", "r", stdin); 9 // freopen("out.txt", "w", stdout); 10 scanf("%d", &T); 11 while(T--) 12 { 13 int N, V; 14 scanf("%d%d", &N, &V); 15 memset(dp, 0, sizeof(dp)); 16 for(int i = 1; i <= N; i++) scanf("%d", &v[i]); 17 for(int i = 1; i <= N; i++) scanf("%d", &w[i]); 18 19 for(int i = 1; i <= N; i++) 20 { 21 for(int j = V; j >= w[i]; j--) 22 { 23 dp[j] = max(dp[j-w[i]]+v[i], dp[j]); 24 } 25 } 26 printf("%d\n", dp[V]); 27 28 } 29 return 0; 30 }
hdu 2602 Bone Collector 01背包模板
标签:
原文地址:http://www.cnblogs.com/titicia/p/5355016.html