(LeetCode 每日一题) 2787. 将一个数字表示成幂的和的方案数(动态规划dp+01背包)
题目:2787. 将一个数字表示成幂的和的方案数
思路:动态规划dp+01背包,时间复杂度
外层是枚举所有可能的数字,内层是维护所有可能的状态的数量。
C++版本:
class Solution {
public:int numberOfWays(int n, int x) {int mod=1000000007;vector<int> f(n+1,0);f[0]=1;for(int i=1;pow(i,x)<=n;i++){int t=pow(i,x);for(int j=n;j>=t;j--){if(f[j-t]!=0) f[j]=(f[j]+f[j-t])%mod;}}return f[n]%mod;}
};
JAVA版本:
class Solution {public int numberOfWays(int n, int x) {int mod=1000000007;int[] f=new int[n+1];f[0]=1;for(int i=1;(int)Math.pow(i,x)<=n;i++){int t=(int)Math.pow(i,x);for(int j=n;j>=t;j--){if(f[j-t]!=0) f[j]=(f[j]+f[j-t])%mod;}}return f[n]%mod;}
}
GO版本:
func numberOfWays(n int, x int) int {mod:=1000000007f:=make([]int,n+1)f[0]=1for i:=1;pow(i,x)<=n;i++{t:=pow(i,x)for j:=n;j>=t;j-- {f[j] =(f[j]+f[j-t])%mod}}return f[n]
}func pow(a,b int) int {return int(math.Pow(float64(a),float64(b)))
}