遞迴和動態規劃 整數和

2022-08-10 08:12:14 字數 844 閱讀 2843

給你乙個陣列arr, 和乙個整數aim。 如果可以任意選擇arr中的數字, 能不能累加得到aim, 返回true或者false 

類似於字串的子串,陣列中的每個數字都可以在求和結果中,也可以不在

所以使用遞迴可以求得

public static boolean issum(int arr, int aim)

public static boolean sum(int arr, int aim, int index, int res)

return sum(arr, aim, index + 1, res + arr[index]) || sum(arr, aim, index + 1, res);

}

改為動態規劃:

* dp維度:位置index和當前的求和結果res,所以dp[arr.length + 1][aim + 1]是二維的(因為在分析可變引數時,最終的返回結果是i == arr.length,會碰到最後一行,所以長度要+1)

* 行代表陣列中的第幾個元素,列代表求和的結果

* 普通位置(i, j)依賴的位置有(i + 1, arr[i] + j)和(i + 1, j)

public static boolean issum2(int arr, int aim)

//不被依賴的位置 (arr.length, aim)是true

dp[arr.length][aim] = true;

for(int i = arr.length - 1; i >= 0; i--)}}

return dp[0][0];

}

遞迴和動態規劃

暴力遞迴 1,把問題轉化為規模縮小了的同類問題的子問題 2,有明確的不需要繼續進行遞迴的條件 base case 3,有當得到了子問題的結果之後的決策過程 4,不記錄每乙個 子問題的解 動態規劃 1,從暴力遞迴中來 2,將每乙個子問題的解記錄下來,避免重複計算 3,把暴力遞迴的過程,抽象成了狀態表達...

整數劃分問題 動態規劃 遞迴

將乙個整數 n 劃分為 不超過m 組 的劃分數 如 n 4m 3 輸出 4 思路 使用動態規劃 定義狀態 dp i j j的i劃分的組數 遞推 dp i j dp i j i dp i 1 j 當m n時,變成了常見的整數劃分問題 cpp view plain copy include includ...

遞迴和動態規劃(一)

題目 給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。解題思路 解法一 暴力遞迴 如果arr 5,10,25,1 aim 1000,過程如下 1.用0張5元的貨幣,讓 10,25,1 組成...