01背包问题
1.空间复杂度O(V) 时间复杂度O(V)
/*
* 01背包问题
* 件数 5 最大重量 8
* 3 5 1 2 2
* 4 5 2 1 3
* */
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "vector"
using namespace std;
const int maxn = 100;//物品最大件数
const int maxv = 1000;//容量上限
int w[maxn], c[maxn], dp[maxv];
/*
* w[] 物品重量
* c[] 物品价值
* dp[v] 容量为v时物品最大价值
* */
int main() {
int n, V;//件数 总容量
scanf("%d%d", &n, &V);
for (int i = 1; i <= n; i++) {
//物品容量
scanf("%d", &w[i]);
}
for (int i = 1; i <= n; i++) {
//物品价值
scanf("%d", &c[i]);
}
//边界
//使用滚动数组 倒序查找
for (int v = 0; v <= V; v++)
dp[v] = 0;
//求解
for (int i = 1; i <= n; i++) {
printf("\n");
for (int v = V; v >= w[i]; v--) {
//状态转移方程
//放入或不放入第i件物品的价值
printf("剩余v: %d ", v);
printf("w[%d]: %d ", i, w[i]);
printf("dp[%d]: %d dp[%d]+c[%d]: %d ", v, dp[v], v - w[i], i, dp[v - w[i]] + c[i]);
dp[v] = max(dp[v], dp[v - w[i]] + c[i]);
printf("新dp[%d]: %d \n", v, dp