题目链接:https://www.acwing.com/problem/content/description/3385/
输入样例:
7
输出样例:
6
题意:一个整数总可以拆分为 22 的幂的和,问一个数不同拆分的种数。
思路:2^20差不多等于1e6,所以2的幂次最多到20。题目可以看作是有n个物品,每个物品价值为2^k,问价值刚好达到n的组合方案数为多少,妥妥的完全背包问题。直接把2的幂次处理成一个数组,然后套完全背包的板子即可
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int mod = 1e9;
int dp[N], a[21];
int32_t main(){
int n; cin >> n;
for(int i = 0; i <= 20; i++) a[i] = (int)pow(2, i);
dp[0] = 1;
for(int i = 0; i < 21; i++){
for(int j = a[i]; j <= n; j++){
(dp[j] += dp[j - a[i]]) %= mod;
}
}
printf("%lld\n", dp[n]);
}