C 如何修改背包-找到最大加权和

C 如何修改背包-找到最大加权和,c,algorithm,linear-algebra,dynamic-programming,knapsack-problem,C,Algorithm,Linear Algebra,Dynamic Programming,Knapsack Problem,下面是一个使用动态规划的背包代码。原始代码将返回最大值之和。但是,我想对其进行调整,使代码返回的最大值为(value*weight)。下面是我所做的,但效果不好,一些建议非常感谢 #include<stdio.h> int max(int a,int b) { return a>b?a:b; } int Knapsack(int items,int weight[],int value[],int maxWeight) { int dp[ite

下面是一个使用动态规划的背包代码。原始代码将返回最大值之和。但是,我想对其进行调整,使代码返回的最大值为(value*weight)。下面是我所做的,但效果不好,一些建议非常感谢

 #include<stdio.h>
int max(int a,int b)
{
        return a>b?a:b;
}
int Knapsack(int items,int weight[],int value[],int maxWeight)
{
        int dp[items+1][maxWeight+1];
        /* dp[i][w] represents maximum value that can be attained if the maximum weight is w and
           items are chosen from 1...i */
        /* dp[0][w] = 0 for all w because we have chosen 0 items */
        int iter,w;
        for(iter=0;iter<=maxWeight;iter++)
        {
                dp[0][iter]=0;
        }
        /* dp[i][0] = 0 for all w because maximum weight we can take is 0 */
        for(iter=0;iter<=items;iter++)
        {
                dp[iter][0]=0;
        }
        for(iter=1;iter<=items;iter++)
        {
                for(w=0;w<=maxWeight;w=w+10)
                {
                        dp[iter][w] = dp[iter-1][w]*weight[iter-1]; /* If I do not take this item */
                        if(w-weight[iter] >=0)
                        {
                                /* suppose if I take this item */
                                dp[iter][w] = max( (dp[iter][w]*weight[iter]) , (dp[iter-1][w-weight[iter]]*weight[iter-1])+(value[iter]*weight[iter]));
                        }
                }

        }
        return dp[items][maxWeight];
}
int main()
{
        int items=12;
        int weight[/*items+1*/13]={60, 20, 20, 20, 10, 20, 10, 10, 10, 20, 20, 10};
        int value[/*items+1*/13]={48, 77, 46, 82, 85, 43, 49, 73, 65, 48, 47, 51};
        int iter;

        int maxWeight=120;
        printf("Max value attained can be %d\n",Knapsack(items,weight,value,maxWeight));
}
#包括
最大整数(整数a,整数b)
{
返回a>b?a:b;
}
整型背包(整型物品,整型重量[],整型值[],整型最大重量)
{
int dp[项目+1][maxWeight+1];
/*dp[i][w]表示如果最大重量为w且
项目从1…i中选择*/
/*dp[0][w]=0,因为我们选择了0项*/
国际热核实验堆;

对于(iter=0;iter我认为这个问题可以简单地通过做以下更改来解决:

在原始背包问题中,将所有
更改为
值*重量
,并正常进行以最大化总值

如果您更改以下内容,则其结果应该是相同的:

dp[iter][w] = dp[iter-1][w]*weight[iter-1]; /* If I do not take this item */
if(w-weight[iter] >=0)
{
  /* suppose if I take this item */
  dp[iter][w] = max( (dp[iter][w]*weight[iter]) , (dp[iter-1][w-weight[iter]]*weight[iter-1])+(value[iter]*weight[iter]));
}


你还应该提到你得到了什么以及你的预期输出是什么。谢谢你指出,马上编辑它~这是魔术!非常感谢!我现在已经成功地获得了输出7820。虽然我真的不明白这背后的概念。@Voyage\u Mystere你不明白什么?而不是最大化价值总和s直接,您可以先将值更改为value*weight,然后将值之和最大化。您代码中的错误是dp[]]已经由value*weights之和组成,因此您不应该再将其与权重相乘。是的,我现在明白了,但我对背包的概念仍然不清楚。为什么我们要设置权重[item+1]你应该尝试详细研究这个链接,而不是权重[项目]?(这里项目指的是项目的数量)。它很好地解释了动态规划算法。
dp[iter][w] = dp[iter-1][w]; /* If I do not take this item */
if(w-weight[iter] >=0)
{
  /* suppose if I take this item */
  dp[iter][w] = max( dp[iter][w] , (dp[iter-1][w-weight[iter]]+(value[iter]*weight[iter]));
}