Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: %lld Java class name: Main
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
13
Sample Output
3
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100010;
int dp[maxn];
int main()
{
dp[1] = 1;
dp[2] = 2;
dp[3] = 2;
dp[4] = 2;
for(int i=5;i<=13;i++)
dp[i] = 3;
//cout<<"ok"<<endl;
int x = 14;
int xx ;
while(x<50000){
xx = x+x-1+x-1;
for(int i=x;i<=xx;i++){
dp[i] = dp[x-1]+1;
}
x = xx+1;
}
//cout<<"ok"<<endl;
int n;
while(scanf("%d",&n)!=EOF){
if(n>=x)
printf("%d\n",dp[x-1]+1);
else
printf("%d\n",dp[n]);
}
return 0;
}