hdu 2602 (01 背包)Bone Collector

经典的DP(01背包)

一、无优化版

状态dp[i][v]表示前i个物品背包容量为V的最大价值

状态转移方程dp[i][j] = max{dp[i - 1][j], dp[i - 1][j - volume[i]]  + value[i]};

 /* Author: ACb0y Date: 2010-9-03 Type: DP(01背包) dp[i][j] = max{dp[i - 1][j], dp[i - 1][j - volume[i]] + volume[i]} ProblemId: hdu 2602 Bone Collector Result: 2911606 2010-09-03 10:54:52 Accepted 2602 62MS 4200K 766 B C++ ACb0y */ #include <iostream> using namespace std; #define max(a, b) (a) > (b) ? (a) : (b) int T; int N, V; int volume[1005]; int value[1005]; int dp[1005][1005]; int main() { #ifndef ONLINE_JUDGE freopen("2602.txt", "r", stdin); #endif cin >> T; while (T--) { cin >> N >> V; int i, j; for (i = 1; i <= N; i++) { cin >> value[i]; } for (i = 1; i <= N; i++) { cin >> volume[i]; } memset(dp, 0, sizeof(dp)); for (i = 1; i <= N; i++) { for (j = 0; j <= V; j++) { if (j >= volume[i]) { dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]); } else { dp[i][j] = dp[i - 1][j]; } cout << "i = " << i << "j = " << j << " value = "<< dp[i][j] << " " << endl; } cout << endl; } cout << endl; cout << dp[N][V] << endl; } return 0; }

二、空间优化(二维->一维)

状态转移方程: dp[j] = max{dp[j],  dp[j - volume[i]] +value[i]}

/* Author: ACb0y Date: 2010-9-03 Type: DP(01背包) dp[j] = max{dp[j], dp[j - volume[i]] +value[i]} ProblemId: hdu 2602 Bone Collector Result: 2911872 2010-09-03 11:50:04 Accepted 2602 15MS 192K 583 B C++ ACb0y */ #include <stdio.h> #include <string.h> #define max(a, b) (a) > (b) ? a : b int T; int N, V; int volume[1001]; int value[1001]; int d[1001]; int main() { #ifndef ONLINE_JUDGE freopen("2602.txt", "r", stdin); #endif scanf("%d", &T); while (T--) { scanf("%d%d", &N, &V); int i, j; for (i = 1; i <= N; i++) { scanf("%d", &value[i]); } for (i = 1; i <= N; i++) { scanf("%d", &volume[i]); } memset(d, 0, sizeof(d)); for (i = 1; i <= N; i++) { for (j = V; j >= volume[i]; j--) { d[j] = max(d[j], d[j - volume[i]] + value[i]); } } printf("%d/n", d[V]); } }

 

你可能感兴趣的:(c,优化,2010)