フルとコードへの不満との違いを見て、
すべてのビンにゼロに初期化ライン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;
}