51nod 1007正整數分組 01揹包變形

2022-05-02 21:39:07 字數 593 閱讀 9721

題目大意就是給n個數,分2組,求2組和之差最小。

這題我一開始寫的dfs結果t了,後面看了題解說是0揹包變形才恍然大悟。第一種解法:先把n個數的和sum求出來,要使得2組數和之差盡可能小,必定是要使得一組逼近sum/2,於是從這裡入手,我們就轉而求從n個數選若干個數,在和<=sum/2的情況下和能取得的最大值,這個時候就很明顯了,這裡把乙個數的大小同時作為該數字的價值和體積,dp[i][j]表示從前i個數選若干個數放進容積為j的揹包中能得到的最大價值,然後可以滾掉一維,最後答案就是dp[sum/2],表示從前n個數選若干個數,和不超過sum/2的情況下的最大和.

看了其他大佬的部落格還發現了第二種解法,定義f[i][j]為把前i個數分2組,差為j是否可行,狀態轉移有3種,詳細見**注釋。這裡就不能滾掉一維了,因為 第一種轉移f[i][j]能從f[i-1][a[i]+j]轉移過來。

第一種解法

#includeusing namespace std;

int dp[5005],a[105];

int main()

for(int j=0;j<=sum;j++)

if(f[n][j])

}

51Nod 1007 正整數分組

將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。input 第1行 乙個數n,n為正整數的數量。第2 n 1行,n個正整數。n 100,所有正整數的和 10000 output 輸出這個最小差input...

51Nod 1007 正整數分組

1007 正整數分組 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。input 第1行 乙個數n,n為正整數的數量。...

51nod 1007 正整數分組

01揹包 需要多做這種題 能看到題想到這個思路 如果sum為奇數 比如 sum 5,那麼sum 2 就是2 所以 總共的sum dp sum 2 就是較大的那一塊分類 然後dp sum 2 就是較小的 然後兩者做差就是 相差最少的 includeusing namespace std const i...