时间限制: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
1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 using namespace std; 5 #define INF 100003 6 int dp[10002]; 7 int main() 8 { 9 int i, z, n; 10 dp[1] = 1, dp[2] = 2; 11 for(i = 3; i < 10001; i++){ 12 dp[i] = INF; 13 for(z = 1; z < i && z <= i / 2; z++){ 14 dp[i] = min(dp[i], dp[i-z] + dp[z]); 15 if(z != 1 && (i%z) == 0){ 16 dp[i] = min(dp[i], dp[i/z]+dp[z]); 17 } 18 } 19 } 20 while(~scanf("%d", &n)) 21 { 22 printf("%d ", dp[n]); 23 } 24 return 0; 25 }