思路:填表。
以下有几种情况:
情况一: 第j件放不进去(当前容量i小于第i件物品),
这时所得价值为:dp[i][j]=dp[i] [j-1]
情况二: 第j件不放进去(容量足够),
这时所得价值为:dp[i][j]=dp[i] [j-1]
情况三: 第j件放进去(容量足够),
这时所得价值为:dp[ i-weigh[j] ] [j-1]+value[j]
/*问题描述:有编号分别为a,b,c,d,e的五件物品,
它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,
每件物品数量只有一个,
现在给你个承重为10的背包,
如何让背包里装入的物品具有最大的价值总和?答案是15*/
/*输入
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[30][30];int i,j,chengzhong=10;
for(i=1;i<=5;i++)
{
scanf("%d %d",&value[i],&weigh[i]);
}
for(j=0;j<=5;j++)//j表示选择范围是前j个物品
{
for(i=0;i<=10;i++)//i负责容量变化
{
if(j==0||i==0)
{
dp[i][j]=0;
}
else if(weigh[j]>i)
{
dp[i][j]=dp[i][j-1];
}
else if(i>=weigh[j])
{
dp[i][j]=max(dp[i][j-1],dp[i-weigh[j]][j-1]+value[j]);
}
}
}
printf("%d",dp[10][5]);
return 0;
}