关于01背包问题,主要是学会状态转移方程(!)
状态转移方程:f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
i是四件物品 j表示当前背包容量,f[n][m] [n]可以偷的物品数量 [m]偷的物品重量
基本思路: 一件物品有两种选择 : 1.选择取这件物品,背包容量j-w[i] 但是会获得该物品的价值v[i]
2.选择不去取这件物品 则 i-1 可以偷的物品数量就少了1个
#include<iostream>
#include<algorithm>
using namespace std;
int f[5][9] = { 0 }; //[n]可以偷的物品数量 [m]偷的物品重量
int w[5] = { 0,2,3,4,5 }; //重量
int v[5] = { 0,3,4,5,8 }; //价值
int main() {
int i, j;// i是四件物品 j表示当前背包容量
memset(f, 0, sizeof(f));
for (int i = 1; i < 5; i++) {
for (int j = 1; j < 9; j++) {
if (w[i] > j) //如果当前背包容量小于当前物品容量
f[i][j] = f[i - 1][j]; //选择不去取这件物品
else f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
}
for (int i = 0; i < 5; i++)
for (j = 0; j < 9; j++)
printf("f[%d][%d]=%d\n", i, j, f[i][j]); //