题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数nn):
先输入一个自然数nn(n≤1000n≤1000),然后对此自然数按照如下方法进行处理:
- 不作任何处理;
- 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
- 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
11个自然数nn(n≤1000n≤1000)
输出格式:
11个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
说明
满足条件的数为6,16,26,126,36,136
思路:
做这个题主要是想用优化的思想来做,这道题我们可以用三层for,两层for,一层for来AC。我把我想到的这三种都说一下,主要是给大家提供更多的思路,毕竟解题的道路是灵活的~
三层 for:
我们可以设dp[i][j]
代表从左边数第i个整数为j的方案数,那么我们就可以得到:
初始化dp[1][j] = 1; (1 <= j <= n)
for (int i = 1; quick(2, i) <= n; i++) { //quick(2, i)为2^i
int j = quick(2, i);
for (; j <= n; j++) {
for (int k = 1; k <= j / 2; k++) {
dp[i + 1][j] += dp[i][k];
}
}
}
这样全部满足条件的dp[i][n]的和即为答案
两层for:
我们可以设dp[i]
代表最右边为数字i有多少种方案,则:
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = 1;
for (int j = 1; j <= i / 2; j++) {
dp[i] += dp[j];
}
}
//dp[n]即为答案
一层for:
和上面一样,我们设置dp[i]
代表最右边为数字i有多少种方案,并用变量sum来记录和,则:
dp[1] = 1;
sum = 0;
for (int i = 2; i <= n; i++) {
dp[i] = 1;
if (!(i & 1)) s += dp[i / 2];
dp[i] += s;
}
//dp[n]即为答案
大概就是这样,Over
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢