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
思路:
动态规划,dp[i]:拼成i所需最少’1‘个数。
#include <stdio.h> #include <string.h> int dp[10001]; int min(int a, int b) { return a < b ? a : b; } int main() { int n, i, j; memset(dp, 127, sizeof(dp)); //初始为最大值 dp[1] = 1; dp[2] = 2; for(i = 3; i <= 10000; i++) { for(j = 1; j < i; j++) { if(i % j == 0) //若能整除则有两个转移方程,加和乘 { dp[i] = min(dp[i], min(dp[j]+dp[i/j], dp[j]+dp[i-j])); } else { dp[i] = min(dp[i], dp[j]+dp[i-j]); //否则只能是加 } } } while(scanf("%d", &n) != EOF) { printf("%d\n", dp[n]); } return 0; }