人民币的构造
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;
}