HDU 3496

  这是一道二维费用的背包问题,将dp多开一维,略修改一下状态转移方程即可,即dp[j][k]=get_max( dp[j-1][k-cost[i]]+value[i],dp[j][k])

  另外,这道题中,加注释的部分是WA了许多次后参考其他人的解题报告后加上的,暂时还没弄清楚为什么要这样做,这应该是背包的初始化的问题,应该要注意细节,问题留在这里,解决之后再修改解题报告。

#include<stdio.h>
#include<string.h>
#define INF 10000000
#define MAX_DVD_AMOUNT 110
#define MAX_L 1100
int get_max(int ,int );
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i,j,k,n,m,l,cost[MAX_DVD_AMOUNT],value[MAX_DVD_AMOUNT],dp[MAX_DVD_AMOUNT][MAX_L];
        scanf("%d%d%d",&n,&m,&l);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&cost[i],&value[i]);
        }
        for(i=0;i<MAX_DVD_AMOUNT;i++)
        {
            for(j=0;j<MAX_L;j++)
            {
                if(i==0) /*这里只能让当i=0时才将dp赋为0*/
                {
                    dp[i][j]=0;
                }
                else
                {
                    dp[i][j]=-INF;
                }
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=m;j>0;j--)
            {
                for(k=l;k>=cost[i];k--)
                {
                    if(dp[j-1][k-cost[i]]!=-INF)/*这里必须判断*/
                        dp[j][k]=get_max( dp[j-1][k-cost[i]]+value[i],dp[j][k]);
                }
            }
        }
        if(dp[m][l]!=-INF)
            printf("%d\n",dp[m][l]);
        else
            printf("0\n");
    }
    return 0;
}
int get_max(int x,int y)
{
    return x>=y?x:y;
}
posted @ 2012-07-26 09:29  等待电子的砹  阅读(648)  评论(0编辑  收藏  举报