確立狀態轉移方程需要深入理解問題,合理定義子問題,找到邊界條件(比如dp[0]),分析狀態之間的轉移關系(dp和dp之間的關系),并進行驗證。
遞歸是自頂向下,而dp是自下而上
這里是i作為目標值,dp[i]是值在目標值為i的nums的組合數
if(x<=i)//x可以作為組合的數
dp[i]+=dp[i-x];
比如nums={1,3,2}
target=4
i--4的目標值
當目標值為4
dp[4]=dp[3]+dp[1]+dp[2]
4-1=3(dp【3】)
4-1=3(dp【1】)
4-2=2(dp【2】)
class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned>dp(target+1,0);dp[0]=1;//目標值為0,有一個組合就是不選for(int i=1;i<=target;i++)for(auto x:nums){if(x<=i)//當x小于等于目標值的時候可以進行組合dp[i]+=dp[i-x];}return dp[target];// 使用 unsigned 可以讓溢出不報錯// 對于溢出的數據,不會影響答案的正確性(題目保證)}
};