题解 完全背包 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>
浙公网安备 33010602011771号