Piggy-Bank HDU - 1114
题意:
小猪储钱罐存在一个大的问题,即无法确定其中有多少钱。因此,我们可能在打碎小猪储钱罐之后,发现里面的钱不够。显然,我们希望避免这种不愉快的情况。唯一的可能是,称一下小猪储钱罐的重量,并尝试猜测里面的有多少硬币。假定我们能够精确判断小猪储钱罐的重量,并且我们也知道给定币种的所有硬币的重量。那么,我们可以保证小猪储钱罐中最少有多少钱。
你的任务是找出最差的情形,即判断小猪储钱罐中的硬币最少有多少钱。我们需要你的帮助。不能再贸然打碎小猪储钱罐了!
题解:
完全背包裸题,本题球的填完背包的情况下最少价值是多少
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=5e4+9;
int dp[maxn];
int p[maxn],w[maxn];
int main()
{int t;cin>>t;while(t--){int e,f;cin>>e>>f;int C=f-e;int n;cin>>n;for(int i=1;i<=n;i++)cin>>w[i]>>p[i];//重量,金额 for(int i=1;i<=C;i++)dp[i]=1e9;dp[0]=0;for(int i=1;i<=n;i++){for(int j=p[i];j<=C;j++){dp[j]=min(dp[j],dp[j-p[i]]+w[i]);}}if(dp[C]==1e9)printf("This is impossible.\n");else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[C]);}
}