苹果
ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。
Input
Output
Sample Input
3 3 1 1 2 1 3 1 0 0
Sample Output
2
这是一道简单动态规划 身为新手的写了一个很简单易懂的代码,不跟网上大牛一样,代码玩的花,又递归,又调用函数的,我不行
建议大家先到网上看大牛分析,这里我还是新手,分析的不清楚
例题的一组数据不能说明问题 下面我来一组数据
5 10
4 6
5 4
3 2
1 5
6 8
结合代码分析 直接上代码分析
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int a[1005][1005];
int c[1001],w[1001];
int main()
{
int n,v;
while(scanf("%d%d",&n,&v)!=EOF)
{
if(n==0&&v==0)
{
break;
}
memset(a,'\0',sizeof(0));
for(int k=1; k<=n; k++)
{
scanf("%d%d",&c[k],&w[k]);
}
for(int i=1; i<=n; i++) //i表示第几件物品
{
for(int j=1; j<=v; j++) //j表示背包空间大小
{
if(j<c[i])
{
a[i][j]=a[i-1][j];
}
else
{
a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);
}
//printf("%2d ",a[i][j]);
}
//printf("\n");
}
printf("%d\n",a[n][v]);
}
}
其他的没什么难的,重点在这部分
for(int i=1; i<=n; i++) //i表示第几件物品
{
for(int j=1; j<=v; j++) //j表示背包空间大小
{
if(j<c[i])
{
a[i][j]=a[i-1][j];
}
else
{
a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);
}
i 表示图片的第 i 行,V表示图片上的第 v 列
原理;这其实就是贪心的变形,动规就是找子问题中找最优解,然后递推,找到原问题的最优解
假设前面我们已经找到最优解了 下面找a[i][j]的最优解
a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);
这其实就是a[i][j]的最优解
如果不明白就带入 i j 一个一个与图表对应
j<c[i] 保证的是a[i-1][j-c[i]]有意义,不会伸出数组外面
当伸出数组外面 a[i][j]=max(a[i-1][j],a[i-1][j-c[i]]+w[i]);不再成立
只能用a[i][j]=a[i-1][j];