等和的分隔子集(01揹包)

2021-08-21 07:48:28 字數 1519 閱讀 4851

這兩個子集合中元素分別的和是相等的。

對於n=3,我們只有一種劃分方法,而對於n=7時,我們將有4種劃分的方案。

輸入包括一行,僅乙個整數,表示n的值(1≤n≤39)。

輸出包括一行,僅乙個整數,曉萌可以劃分對應n的集合的方案的個數。當沒發劃分時,輸出0。

7

樣例輸出

4

計蒜客上面的一道題。

主要就是兩個for迴圈,第乙個for迴圈,列舉出1-n,第二個for迴圈,列舉他們的累加和,然後更新當前1-i個數累加的方案數

dp[i][j]的意思是,用前i個數累積到j,有多少種方案

dp[i][j] = dp[i-1][j]+dp[i-1][j-i];

這個轉移方程的意思是,當前的方案數等於  上乙個累積到j的方案數  + 上乙個累積到j-i的方案數

例如 i = 3時,首先dp[3][0] = 1,dp[3][1] = 1,  dp[3][2] = 1(這幾個都是直接複製前面的),    然後dp[3][3] = 1+1 = 2

就是本來已經湊成3的方案數 + 加入3後湊成3的方案數 = 2;

還有個問題就是 基層為1,即 dp[1][0] = 1,dp[2][1] = 1,dp[3][i] = 1,................

至於為什麼,是為了統一轉移方程,然後就需要自己去仔細想想了

以後一定回來看一遍,一定!!!

#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

ll dp[42][4500];

int main()

goal = goal>>1;

memset(dp,0,sizeof dp);

dp[0][0] = 1;

for( int i = 1 ; i <= n ; i++ )

}printf("%lld\n",dp[n][goal]/2);

}return 0;}/*

*/

下面是進行空間優化的寫法,思路完全一樣

#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

ll dp[4500];

int main()

goal = goal>>1;

memset(dp,0,sizeof dp);

dp[0] = 1;

for( int i = 1 ; i <= n ; i++ )

printf("%lld\n",dp[goal]/2);

}return 0;

}

等和的分隔子集 DP

曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n 3,對應的集合能被劃分成 和 兩個子集合.這兩個子集合中元素分別的和是相等的。對於n 3,我們只有一種劃分方法,而對於n 7時,我們將有4種劃分的方案。輸入包括一行,僅乙個整數,表示n的值 1 n 39...

動態規劃 等和的分隔子集

題目 曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n 3,對應的集合能被劃分成 和 兩個子集合.這兩個子集合中元素分別的和是相等的。對於n 3,我們只有一種劃分方法,而對於n 7時,我們將有4種劃分的方案。輸入包括一行,僅乙個整數,表示n的值 1 n...

動態規劃 等和的分隔子集

曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n 3,對應的集合能被劃分成 和 兩個子集合.這兩個子集合中元素分別的和是相等的。對於n 3,我們只有一種劃分方法,而對於n 7時,我們將有4種劃分的方案。輸入包括一行,僅乙個整數,表示n的值 1 n 39...