c语言01背包问题动态规划出错。麻烦各位帮忙纠错一下,谢谢

2025-03-21 04:10:35
推荐回答(1个)
回答1:

你这是完全背包。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;
}