給你乙個陣列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 組成...