從陣列分割到揹包問題(2)

2021-06-14 08:16:38 字數 666 閱讀 5197

從陣列分割到揹包問題(1)留下乙個問題,時間複雜度和空間複雜度還可以進一步優化麼?

從狀態方程

f[i][j][k] = max(f[i-1][j][k],f[i-1][j][k-a[i]]+a[i]),其中1<=i<=2n,1<=j<=min(i,n),1<=k<=sum/2

可以看出來,f[i][j][k]只與f[i-1]有關,那我們是否能夠去掉i那一維呢?因為f[i][j][k]只與f[i-1]有關,所以我們用二維陣列來代替的時候應該對f[i][j][k]的「j」維進行逆序遍歷。為什麼?因為只有這樣才能保證計算f[i][j][k]時利用的f[i-1][j]和f[i-1][j-1]是真正i-1這個狀態的值,如果正序遍歷,那麼當計算f[j]時,f[j-1]已經變化,那麼計算的結果就是錯誤的。這樣,就將空間複雜度優化到了o(n/2*sum),時間複雜度沒變。

好了,上**:

int dp[50][1000];

int getsplitarraysumimproved(int *arr, int n)

}} }

return dp[n>>1][val];

}

這個**是不是有點眼熟呢?不錯,正是《程式設計之美》上的解法三~

好了,接下來要詳細講解揹包問題了~

程式設計之美2 18 由陣列分割到揹包問題(1)

程式設計之美上2.18題 有乙個無序,元素個數為2n的正整數陣列,要求 如何能把這個陣列分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近?eg 1,5,7,8,9,6,3,11,20,17 1,3,11,8,20 5,7,9,6,17 分析 題目的本質是從2n個整數中找出n個數,使得其和最接近...

陣列分割問題

昨天同學問我一道關於陣列分割的問題 有乙個無序 元素個數為2n的正整數陣列,要求 如何能把這個陣列分割為元素個數為n的兩個陣列,並是兩個子陣列的和最接近。假設2n個整數之和為sum。從2n個整數中找出n個元素的和,有三種可能 大於sum 2,等於sum 2,小於sum 2。可以考慮小於等於sum 2...

揹包問題 可分割

可分割的揹包問題 即挑菜單位價值最大的物品裝入即可。寶物 i12 3456 78910 重量w i 42 9558 5455 價值v i 38 186820 56715 求裝入寶物的最大價值,以及裝入寶物的序號。include include using namespace std 需要乙個結構體,...