Piggy-Bank HDU - 1114 (完全背包模板题)

题目:

在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]);
	}	
}

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/107468511
今日推荐