杭电2602 贪心算法

题意:某人喜欢收集骨头,现在有一个包。求此包能装的最大价值骨头。
经典的贪心算法
现在i是骨头的价值,j是骨头的体积。
先来解释一下这个式子: p[i][j]=max(p[i-1][j],p[i-1][j-b[i]]+a[i]);在这道题中每个骨头只能选一次,所以每个骨头仅仅是选或不选的问题。对于有0到i价值的骨头与1到j的体积,判断价值i的骨头选不选,若不选则是p[i-1][j]价值大,若选的话是有0~i-1个骨头和体积为j-b[i]最优解加上a[i].所以需要比较一下那个大。
可以推一下下面的表格。
杭电2602 贪心算法_第1张图片
“体积i”不小心打错了,应该是“价值i”。
下面是代码:

#include<stdio.h>
#include<memory.h>
int p[1000][1000];
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
    int a[1000],b[1000];
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int N,V;
        int i,j;
        scanf("%d%d",&N,&V);
        for(i=1; i<=N; i++)
            scanf("%d",&a[i]);
        for(i=1; i<=N; i++)
            scanf("%d",&b[i]);
        memset(p,0,sizeof(p));
        for(i=1; i<=N; i++)
            for( j=0; j<=V; j++)
            {
                if(j>=b[i])
                    p[i][j]=max(p[i-1][j],p[i-1][j-b[i]]+a[i]);
                else p[i][j]=p[i-1][j];
            }
        printf("%d\n",p[N][V]);
    }
    return 0;
}

你可能感兴趣的:(算法,杭电)