Problem: 2787. 将一个数字表示成幂的和的方案数
文章目录
思路
动态规划01背包
解题过程
- 用
dp[j]
表示"从已经处理过的数里,凑出和为 j 的方案数"。 - 遍历数字
i
的时候,从j = n
倒着更新到val(val = i^x)
,dp[j] = (dp[j] + dp[j - val]) % mod
。
复杂度
- 时间复杂度: O ( n n x ) O(n\sqrt[x]{n}) O(nxn )
- 空间复杂度: O ( n ) O(n) O(n)
Code
cpp
class Solution {
public:
int numberOfWays(int n, int x) {
const long long MOD = 1e9 + 7;
vector<long long> dp(n + 1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
long long val = pow(i, x);
if (val > n) {
break;
}
for (int j = n; j >= val; j--) {
dp[j] = (dp[j] + dp[j - val]) % MOD;
}
}
return dp[n];
}
};