2787. 将一个数字表示成幂的和的方案数

Problem: 2787. 将一个数字表示成幂的和的方案数

文章目录

思路

动态规划01背包

解题过程

  1. dp[j]表示"从已经处理过的数里,凑出和为 j 的方案数"。
  2. 遍历数字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];
    }
};