1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 int w[102]; // w[i]表示第i个物品的体积 8 int v[102]; // v[i]表示第i个物品的价值 9 int dp[102][1002]; // dp[i][j]表示在总体积不超过 j 的情况下,前 i 个物品所能达到的最大价值。 10 11 12 int main() 13 { 14 int N, V; // N表示物品总个数,V表示背包体积 15 while(cin >> V >> N) 16 { 17 for(int i = 1; i <= N; ++i) 18 cin >> w[i] >> v[i]; 19 20 for(int j = 0; j <= V; ++j) 21 dp[0][j] = 0; // 初始化 22 23 for(int i = 1; i <= N; ++i) 24 { 25 for(int j = 1; j <= V; ++j) 26 { 27 if(j >= w[i]) // 如果当前总体积大于该物品体积 28 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]); 29 else // 如果当前总体积大于该物品体积,即不能装下该物品 30 dp[i][j] = dp[i-1][j]; 31 } 32 } 33 34 cout << dp[N][V] << endl; 35 } 36 37 return 0; 38 }
空间优化:
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 int w[102]; // w[i]表示第i个物品的体积 8 int v[102]; // v[i]表示第i个物品的价值 9 int dp[1002]; 10 11 12 int main() 13 { 14 int N, V; // N表示物品总个数,V表示背包体积 15 while(cin >> V >> N) 16 { 17 for(int i = 1; i <= N; ++i) 18 cin >> w[i] >> v[i]; 19 20 for(int j = 0; j <= V; ++j) 21 dp[j] = 0; // 初始化 22 23 for(int i = 1; i <= N; ++i) 24 { 25 for(int j = V; j >= 1; --j) 26 { 27 if(j >= w[i]) 28 dp[j] = max(dp[j], dp[j-w[i]] + v[i]); 29 } 30 } 31 32 cout << dp[V] << endl; 33 } 34 35 return 0; 36 }