【问题标题】:how to modify Knapsack - to find the maximum weighted sum如何修改背包 - 找到最大加权和
【发布时间】:2013-12-25 07:10:33
【问题描述】:

下面是一个使用动态规划的背包代码。原始代码将返回值的最大总和。但是,我想对其进行调整,以便代码返回(值*权重)的最大总和。以下是我所做的,但效果不佳,不胜感激。

 #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));
}

代码预计会给出Max value attained can be 7820的输出(手动计算的值*重量的最大总和)。但是,输出是获得的最大值可以是 0。为什么?

【问题讨论】:

  • 您还应该提及您将获得什么以及您的预期输出。
  • 感谢指出,马上修改~

标签: c algorithm linear-algebra dynamic-programming knapsack-problem


【解决方案1】:

我认为只需进行以下更改即可解决问题:

在原来的背包问题中,将所有values改为value*weight,然后正常进行,使总值最大化。

http://en.wikipedia.org/wiki/Knapsack_problem

如果你改变它应该是一样的:

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]));
}

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]));
}

【讨论】:

  • 这太神奇了!非常感谢你!我现在已经成功获得了输出 7820。虽然我不太明白这背后的概念。
  • @Voyage_Mystere 你不明白什么?而不是直接最大化值的总和,您可以先将值更改为 value*weight,然后最大化值的总和。
  • 您的代码中的错误是 dp[][] 已经由 values*weights 的总和组成,因此您不应再次将其与权重相乘。
  • 是的,我现在明白了,但我对背包的概念仍然很模糊。为什么我们应该放 weight[item+1] 而不是 weight[item]? (这里的item是指item的个数)
  • 您应该尝试并详细研究此链接。它很好地解释了动态规划算法。 en.wikipedia.org/wiki/Knapsack_problem
猜你喜欢
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多