贪心--poj3040 Allowance

题目链接

作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴。FJ有一套硬币N种(1≤N≤20)不同的面额,每枚硬币是所有比他小的硬币面值的倍数,例如1美分硬币、5美分硬币、10美分硬币和50美分硬币。使用这些硬币,FJ每周至少给Bessie C(1 <= C <=100000000)美分。请你计算他最多能给Bessie几周

Input

* 第一行N 、 C

* 第 2..N+1行: 硬币价值 V (1 <= V <= 100,000,000) 和数量 B (1 <= B <= 1,000,000)

Output

* 使用这些硬币,每周至少给C美分的前提下的最多周数

Sample Input

3 6
10 1
1 100
5 120

Sample Output

111

题解:首先对数据按面值从大小排序,对面值大于C的直接加上其数量。然后从剩余的面值中从大到小凑金额money使其小于等于C,若money<C,则在从剩余的面值中从小到大凑金额使其大于C。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
pair<int,int> a[22];
int n,c;
int use[22];
int main(){
	cin>>n>>c;
	for(int i=0;i<n;++i){
		cin>>a[i].first>>a[i].second;
	}
	sort(a,a+n);
	long long sum=0;
	int k=-1;
	for(int i=n-1;i>=0;--i){
		if(a[i].first>=c) sum+=a[i].second;
		else {
			k=i;break;	
		}
	}
	while(true){
		int money=0;
		for(int i=k;i>=0;--i){
			while(a[i].second&&money+a[i].first<=c){
				a[i].second--;
				money+=a[i].first;
			}
		}
		if(money>0){
			for(int i=0;i<=k;i++){
				while(a[i].second&&money<c){
					a[i].second--;
					money+=a[i].first;
				}
			}
		}
		if(money<c) break;
		sum++;
	}
	cout<<sum<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值