ones
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Given a positive integer N (0<=N<=10000), you are to find an expression equals to N using only 1,+,*,(,). 1 should not appear continuously, i.e. 11+1 is not allowed.
-
输入
- There are multiple test cases. Each case contains only one line containing a integer N 输出
- For each case, output the minimal number of 1s you need to get N. 样例输入
-
2 10
样例输出
-
2 7
-
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define INF 0x3f3f3f3f #define ll long long using namespace std; ll dp[10010]; void find() { int i,j,k; dp[1]=1; for(i=2;i<10010;i++) { dp[i]=INF; for(j=i-1;j>0;j--) { dp[i]=min(dp[i-j]+dp[j],dp[i]);//i由(i-j)和j的和得到。 if(i%j==0)//如果i%j==0,则可以通过i和j的乘积得到。 dp[i]=min(dp[i],dp[j]+dp[i/j]); } } } int main() { int n; find(); while(scanf("%d",&n)!=EOF) { printf("%lld\n",dp[n]); } return 0; }