【0-1背包变种】力扣2787. 将一个数字表示成幂的和的方案数

给你两个 正 整数 n 和 x 。

请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说,你需要返回互不相同整数 n1, n2, ..., nk 的集合数目,满足 n = n1x + n2x + ... + nkx 。

由于答案可能非常大,请你将它对 109 + 7 取余后返回。

比方说,n = 160 且 x = 3 ,一个表示 n 的方法是 n = 23 + 33 + 53 。

示例 1:

输入:n = 10, x = 2

输出:1

解释:我们可以将 n 表示为:n = 32 + 12 = 10 。

这是唯一将 10 表达成不同整数 2 次方之和的方案。

示例 2:

输入:n = 4, x = 1

输出:2

解释:我们可以将 n 按以下方案表示:

  • n = 41 = 4 。
  • n = 31 + 11 = 4 。

提示:

1 <= n <= 300

1 <= x <= 5

cpp 复制代码
const int MOD = 1e9 + 7;
        
class Solution {
public:
    int numberOfWays(int n, int x) {
        vector<int> f(n+1);
        f[0] = 1;
        for (int i = 1; ; i++) {
            int v = std::pow(i, x);
            if (v > n) break;
            for (int s = n; s >= v; s--) {
                f[s] = (f[s] + f[s - v]) % MOD;
            }
        }
        return f[n];
    }
};

0-1背包问题的变种,首先我们定义一个一维数组f,fs表示可以用不同整数的 x 次幂来表示 s 的所有组合方式的数量。当 v > n 时,意味着 v 已经超过了目标数 n,所以没有必要继续计算更大的幂次,因为它们不可能再参与组合成 n。f[s] = (f[s] + f[s - v]) % MOD这个公式的意思是:当前目标数 s 的组合方式 fs 应该包括所有能组合成 s-v 的组合方式 fs-v,因为你可以通过加上 v 来实现 s。最后返回 fn,它表示用 x 次幂的整数来组合成 n 的所有不同方案的数量。

相关推荐
一只不想敲代码的程序猿6 小时前
如何更高效地拆解问题?
算法
微尘hjx8 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技8 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er9 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
文丑颜不良啊9 小时前
LeetCode1901~1920题目解析
java·leetcode
Pniubi9 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
On The Road :9 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
微尘hjx10 小时前
【Deep-OC-SORT 03】多轨迹算法Deep-OC-SORT-卡尔曼滤波预测过程
算法·yolo·目标跟踪·ultralytics·车跟踪·轨迹算法·deep-oc-sort
老师我太想进步了202612 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
机器人零零壹17 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法