解法归纳:
一、如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
二、如果装得下当前物品。
假设1 :装当前物品,在给当前物品预留了相应空间的情况下,前n-1 个物品的最佳组
合加上当前物品的价值就是总价值。
假设2:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样
的。
选取假设1和假设2中较大的价值,为当前最佳组合的价值。
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N = 1010;
int a[N][N], w[N], v[N], n;
signed main()
{
cin >> n; //输入物品个数,物品编号从1~n
for (int i = 1; i <= n; i++)
{
cin >> w[i]; //输入每个物品的重量(容量)
}
for (int i = 1; i <= n; i++)
{
cin >> v[i]; //输入每个物品的价值
}
for (int i = 1; i <= 8; i++) //8是背包容量
{
for (int j = 1; j <= 8; j++)
{
if (w[i] <= j)
{
//如果当前物品容量小于背包容量,我们就有两个选择 放或不放
//1.将当前物品放入背包,那么背包此时剩余的容量位 j - w[i]
//此时我们还要加入容量为 j - w[i] 背包可以放入的物品,即 a[i - 1][j - w[i]]
//故第一种选择可以放进的价值为 a[i - 1][j - w[i]]+v[i]
//2.如果我们不放当前物品,那么就继续选择第 i-1 件物品放入背包
a[i][j] = max(a[i - 1][j], a[i - 1][j - w[i]]+v[i]);
}
else
{
//如果当前物品容量小于背包容量,只能选择不放,就自动放入 i-1 件物品的最优选择
a[i][j] = a[i - 1][j];
}
}
}
cout << a[8][8] << endl; //此时最后一行最后一列就是前n个物品的最优选
return 0;
}