1. 程式人生 > >動態規劃之劃分兩個和相同的子集

動態規劃之劃分兩個和相同的子集

題目描述:

給一 只含有正整數的非空陣列, 找到這個陣列是否可以劃分為 兩個 元素和相等的子集。

注意事項:
所有陣列元素不超過100.
陣列大小不超過200.

樣例:
給一陣列 [1, 5, 11, 5] , 返回 true ,
兩個子集:[1, 5, 5], [11]
給一陣列 [1, 2, 3, 9] , 返回 false

思路:首先判斷元素總和,如果是奇數一定分不出;
 

是偶數的話,就用動態規劃:dp[i][j]表示在第一個到第i個元素集中,是否存在和為j的布林值;

sum=sum/2;

int[][] dp=new int[len+1][sum+1];

套路基本就是dp【i】【j】,i表示數目之類的,而j就用來表示總和,總價值之類的;

dp【i】【j】=dp【i-1】【j】(表示從dp[i-1][j]到dp[i][j]就沒拿東西(總數沒變))

dp【i】【j】=dp【i-1】【j-A【i-1】】(表示dp【i-1】【j-A【i-1】】到dp[i][j]拿了東西(因為總數加上了A[i-1]))

橫座標表示j從1---》sum之間,若j大於nums[i-1]的話,那就用j,那麼總數就變成了[j-[nums[i-1]]],(即j表示零錢數,為什麼j能替換掉nums[i-1],因為j比它大;如果j比nums[i-1]小的話,[j-[nums[i-1]]]是不存在的,也就不能代替nums[i-1]了)