hdu 1114

完全背包问题,并且要求恰好装满背包

且求的是最小值

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define MAX 9999999999
using namespace std;
int sumweight;//
int weight[550];
int value[550];
int N;//硬币种类数目
__int64 d[10010];
int main()
{
    int total;
    scanf("%d",&total);
    while(total--)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        sumweight=b-a;
        scanf("%d",&N);
        int i,j;
        for(i=0;i<N;i++)
        {
            scanf("%d %d",&value[i],&weight[i]);
            value[i]*=(-1);
        }
        d[0]=0;
        for(i=1;i<=sumweight;i++)
        {
            d[i]=-1*MAX;
        }
        for(i=1;i<=N;i++)
        {
            for(j=0;j<=sumweight;j++)
            {
                if(j-weight[i-1]<0)
                {
                    continue;
                }
                d[j]=d[j]>(d[j-weight[i-1]]+value[i-1])?d[j]:(d[j-weight[i-1]]+value[i-1]);
            }
        }
        if(d[sumweight]==(-1)*MAX)
        {
            printf("This is impossible.\n");
            continue;
        }
        printf("The minimum amount of money in the piggy-bank is %I64d.\n",-1*d[sumweight]);
    }
    return 0;
}
posted @ 2012-08-09 09:47  willzhang  阅读(157)  评论(0编辑  收藏  举报