题解 完全背包 HDU 1114

题意:给T组数据,给出一个存钱罐存钱前后质量,再给出N种放入的钱币的币值和重量,不计数量,求使得该存钱罐达到之后质量的最小存储金额。

做法:用完全背包。建立一个数组,用无限大的一个值初始化每个元素,并使f[0]=0;用完   全背包公式即可得出答案。

代码:

#include <iostream>

#include <algorithm>
#include <cstring>
using namespace std;
int w[505],c[505],f[10050];
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int x1,x2,sum,i,j,n;
        memset(w,0,sizeof(w));
        memset(c,0,sizeof(c));
        memset(f,0,sizeof(f));
        cin>>x1>>x2;
        sum=x2-x1;
        cin>>n;
        for(i=1;i<=n;i++)
            cin>>c[i]>>w[i];
        f[0]=0;
        int ans=999999;
        for(j=1;j<=sum;j++)
            f[j]=ans;
        for(i=n;i>0;i--)
                for(j=w[i];j<=sum;j++)
                    f[j]=min(f[j],f[j-w[i]]+c[i]);
        if(f[sum]==999999)
            cout<<"This is impossible."<<endl;
        else
       cout<<"The minimum amount of money in the piggy-bank is "<<f[sum]<<"."<<endl;
    }
    return 0;
}
错误:1 在求最大值,初始化所有元素为0,在求最小值时,未能初始化所有元素最大。
      2 未能注意f[0]的值。<span style="white-space:pre">	</span>

posted on 2014-07-18 21:30  一锅土豆  阅读(87)  评论(0编辑  收藏  举报