动态规划 / 贪心----Money

Money

题目

Edward当上了E国的国王. 然而E国使用的钞票中有的钞票的面值包含数字5, 这个数字对Edward来说是个不幸运的数字, 于是他打算改变钞票的面值. Edward的幸运数字是3, 7, 他打算把E国的钞票面值改成:

1元, 3元, 7元, 10元, 30元, 70元, 100元, 300元, 700元, 1000元, 3000元, 7000元, 10000元.

那么对于货币而言, 要凑够x (1 ≤ x ≤ 10^18) 元至少需要多少张钞票?

输入描述
Input
输入包含多组测试数据.

第一行为一个整数n (1 ≤ n ≤ 200000). 表示测试数据的数量

紧接着为n行, 每行一个数字x (1 ≤ x ≤ 10^18).

输出描述
Output
对于每组测试数据, 输出凑够x (1 ≤ x ≤ 10^18) 元至少需要钞票的数量.

样本输入
Input example
3
5 23 139
样本输出
Output example
3
3 5

解答

#include<stdio.h>

int min99[100000];
int money[]={1,3,7,10,30,70,100,300,700,1000,3000,7000,10000};

int main(){
	long long head,HEAD;
	int x;
	int n;
	int J;
	for(int i=0;i<100000;i++) min99[i]=i;
	for(int i=1;i<100000;i++){
		for(int j=1;j<13;j++){
			J=i-money[j];
			if(J>=0){
				if((min99[J]+1)<min99[i]) min99[i]=min99[J]+1;
			}
		}
	}
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lld",&head);
		HEAD=head;
		x=head%100000;
		head=(head-x)/10000;
		head+=min99[x];
		if(HEAD>=100000){
			if(x>=4000&&x<6000){
			head--;
			if(x>=4400&&x<4600){
				head++;
				if(x<4500){
					x=x%1000;
		    	    if(x>=440&&x<460) head--; 
		    	    x=x%100;
		    	    if(x==44||x==45) head++;
				}
			}
		}
		}
		printf("%lld\n",head);
    }
    return 0;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值