你这是完全背包。01背包每个物品只能装一次,因此必须和上一个物品比较,否则会出现重复装的情况。
f[i][j]表示把前i个物品装入容量为j的箱子能得到的最大价值
则有:
f[i][j]=max(f[i-1][j]/*不装*/,f[i-1][j-c]+v/*装,但必须满足j>=c*/)
改好的代码如下所示:
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int c[] = {0,5,3,4,3,5};//消耗
int v[] = {0,500,200,300,350,400}; // value
int f[6][11];
memset(f,0,sizeof(f)); //归位0
for(int i = 1; i <= (sizeof(c)/sizeof(int) - 1); i++) //i 第几个物品
{
for(int p = 1; p <= 10; p++) //表示10 个空间
{
if(p < c[i])
{
f[i][p] = f[i][p - 1];
}
else
{
// f[i][p] = max(f[i - 1][p], f[i][p - c[i]] + v[i]);
f[i][p] = max(f[i - 1][p], f[i - 1][p - c[i]] + v[i]);
}
}
}
printf("%d",f[5][10]);
return 0;
}