通过学习之前的01背包问题,你已经准备跨入背包问题的小海洋了,那么现在,让我们来看看你的下一个难题是什么:
完全背包问题
完全背包基于01背包问题,区别是完全背包问题中,我们的物品可以取多次,也就是说,即使这个物品我们已经取过了,那么我们仍然可以取这个物品来尝试最优解;
通过查看问题之后我们发现,完全背包问题与01背包问题的状态表示基本相同,我们会开一个二维数组,横坐标i表示前i件物品,纵坐标j表示容积为j,那么g[i][j]表示的就是此状态下我们的最优解;
那么我们的状态计算呢?这时候我们发现,我们能多次取这个物品,于是我们可以再加一层循环,只要有空间能装得下,我们就一直取,同时进行比较,我们只要价值最大的解,于是我们的代码就顺理成章的被写出来了:
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int v[N],w[N];
int g[N][N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];//正常输入我们物品的价值
}
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k*v[i]<=j;k++)//多个物品
g[i][j]=max(g[i][j],g[i-1][j-k*v[i]]+k*w[i]);
//这里的k表示第i个物品有多少个,减去k个i的体积之后计算其解与原来比较即可
cout<<g[n][m];
}
思路基本与01背包问题的一致,只不过我们多加了一步循环
至此结束