0
点赞
收藏
分享

微信扫一扫

uestc 人民币的构造 1264 (打表)


人民币的构造


Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)



Submit  Status



我们都知道人民币的面值是1、2、5、10,为什么是这个数值呢,我们分析了下发现,从1−10的每个数字都可以由每种面值选出至多一张通过加法和减法(找钱)来构成,(比如:1+2=3,5−1=4,5+1=6,5+2=7,1+2+5=8,10−1=9)

但是实际上,我们只需要1、2、7三种面值就可以组成1−10的每一个数字了

(1+2=3,7−1−2=4,7−2=5,7−1=6,7+1=8,7+2=9,7+1+2=10)

那么现在问题来了,给一个数n,请问最少需要多少种不同的面值就可以构成从1−n的所有数字,注意在构成每一个数字时同种面值不能超过1张。



Input

一个数字n(1<=n<=100000)



Output

一个数字,代表最少需要多少种不同的面值可以构成从1−n的所有数字。



Sample input and output

Sample Input

Sample Output

10

3



#include<stdio.h>
int sum[13];
int main()
{
	int n,i;
	int a[13]={0,1,3,9};
	sum[1]=1;sum[2]=4;sum[3]=13;
	for(i=4;i<=12;i++)
	{
		a[i]=sum[i-1]*2+1;
		sum[i]=sum[i-1]+a[i];
	}
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=12;i++)
			if(sum[i]>=n)
				break;
		printf("%d\n",i);
	}
	return 0;
}

//下面的是WA了13次的代码

#include<stdio.h>
int sum[13];
int main()
{
	int n,i;
	int a[13]={0,1,2,7};
	sum[1]=1;sum[2]=3;sum[3]=10;
	for(i=4;i<=12;i++)
	{
		a[i]=sum[i-1]*2+1;
		sum[i]=sum[i-1]+a[i];
	}
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=12;i++)
			if(sum[i]>=n)
				break;
		printf("%d\n",i);
	}
	return 0;
}


 



举报

相关推荐

0 条评论