問題の完全な01バックパック

これを読むことをお勧め

フルとコードへの不満との違いを見て、

すべてのビンにゼロに初期化ライン0:最大値を記入するだけでなく、

そして、最大の可能な値で満たさ:行0の最初の要素を0に初期化され、この行の他の要素の割り当ては、-∞(-999も、その絶対値の主な保証は、すべての商品の値よりも大きいとすることができます) F [0] = 0; F [1〜n]は=-∞

アイデア
理由:

不可能は(ない項目は、機器が満たされることはありませんどのように行くことにする)一杯になったときの容量が正である一方で、フルの場合は、商品の不存在下で、唯一の0全容量のバックパックに、ロードされました。

したがってここで、f [1〜n]は-∞に対応するマークない埋めるために初期化されます。

行1の導出した後、

あなたは、単に[J] = MAX(DP [J]、DP [J-量る[I]] +値[i])と、このため数式のDP、最初のオブジェクト1内に充填されて明らかにのみ正;行0 1 0のみ、他の人は非常に負、負、わずかだけJ-計量オブジェクトに置くだけ最初のものである[I]が0に等しい場合、DP [jは、計量[I]が0に等しい場合のみこのDP [J-計量[I] +値は、[それ]は正の数であってもよいです。[I] J-秤量後、0は全く埋め、DP [J-計量[I]は、必ずしも否定的である、いずれの場合のDPに[J-計量[I] +値[I]は、ここで、陰性であることを意味しないものよりも大きいです一度他のマークの当量(詰め物ではありません)

二行目に、

容量は、2つの物品を収容するのに十分である場合、DP +値[I]、[J-計量] [I]が非負である場合には、それだけには[I] J-計量[]だけのみDP、上記のように、充填された手段であります場合非負DP、DP [J-計量[I] +値[i]は、それが明らかにJ-計量、非負であってもよい[I] [I]、[J-計量】物体の重量に等しい、非負であります等々

/*问题描述:有编号分别为a,b,c,d,e的五件物品,
它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,
每件物品数量只有一个,
现在给你个承重为10的背包,
如何让背包塞满且里装入的物品具有最大的价值总和?答案是15*/


/*
v w
            输入
6 2
3 2
5 6
4 5
6 4

           */

#include<stdio.h>
int max(int a,int b)
{
    if(a>b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
int main()
{


		int value[30],weigh[30],dp[80],maxn=0;
		int i,j;


for(i=1;i<=5;i++)
{

        scanf("%d %d",&value[i],&weigh[i]);

}
weigh[0]=0;
for(i=0;i<=5;i++)//i负责滚动行的次数,j负责容量变化
{



    for(j=10;j>=weigh[i];j--)
   {


        if(j==0)
        {
            dp[j]=0;//初始化
        }
        if(j!=0&&i==0)
        {
            dp[j]=-999;//初始化
        }
        if(j!=0&&i!=0)
        {
            dp[j]=max(dp[j],dp[j-weigh[i]]+value[i]);
        }


        if(dp[j]>maxn)
        {
           maxn=dp[j];
        }


   }


}

printf("%d",maxn);

	return 0;
}



公開された11元の記事 ウォンの賞賛0 ビュー134

おすすめ

転載: blog.csdn.net/weixin_45670020/article/details/104143351