- 问题
已知有一个最多可以装质量W的背包,还有N件物品,第i件物品的质量是w[ i ],价值是v[ i ],每种物品尽可以放一件,可以选者放或者不放,而且不可以超过背包的最大承受的重量 - 解析

- 设计
for(int i = 1; i <= N; i++){
for(int j = 1; j <= W; j++){
if(j < w[i]) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
- 分析
时间复杂度:O(n^2) - 源码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
int W, N, w[100], v[100], dp[100][100];
scanf("%d %d", &W, &N);
for(int i = 1; i <= N; i++) scanf("%d", &w[i]);
for(int i = 1; i <= N; i++) scanf("%d", &v[i]);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= N; i++){
for(int j = 1; j <= W; j++){
if(j < w[i]) dp[i][j] = dp[i - 1][j];
else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
}
printf("%d\n", dp[N][W]);
return 0;
}