人民币的构造
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
我们都知道人民币的面值是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;
}
本文探讨了一个有趣的数学问题:如何使用最少数量的不同面值人民币纸币来构成任意数额的现金,范围从1到n。通过分析,文章提供了一种算法实现思路,并分享了在编程竞赛中的实战经验。
&spm=1001.2101.3001.5002&articleId=50529236&d=1&t=3&u=8c20b13b840f49e1a5a80d9566716abe)
436

被折叠的 条评论
为什么被折叠?



