题解 完全背包 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>