题目:
在acm能够做任何事情之前, 必须编制预算并获得必要的财政支持。这一行动的主要收入来自IBM。这个想法其实很简单,每当一些会员有一点小钱时,他就会把所有的硬币都扔到小猪存钱罐里。这个过程是不可逆转的, 除非打破猪,否则硬币不能拿出来。过了足够长的时间, 存钱罐里应该有足够的现金来支付所有需要支付的费用。
但存钱罐存在很大问题:不可能确定里面有多少钱。所以我们可能敲破猪才发现没有足够的钱。显然, 我们要避免这种不愉快的情况,唯一的可能是称重猪,并试图猜测里面有多少枚硬币。假设我们能够准确地确定猪的重量, 而且我们知道给定货币的所有硬币的重量。然后在存钱罐里有一些最低数量的钱, 我们可以保证。你的任务是找出这个最坏的情况, 并确定在存钱罐内的最低现金金额。
AC代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
int dp[maxn],w[maxn],v[maxn];
int main(){
int t;
cin>>t;
while(t--){
int a,b,s;
cin>>a>>b;
s=b-a;
int n;
cin>>n;
fill(dp,dp+s+1,inf);
dp[0]=0;//初始化
for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=w[i];j<=s;j++)
dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
if(dp[s]==inf)cout<<"This is impossible."<<endl;
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[s]);
}
}