計蒜客經典dp揹包題 等和的分隔子集

2021-10-02 21:08:50 字數 1199 閱讀 5163

曉萌希望將1到n的連續整數組成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於n=3,對應的集合能被劃分成 和 兩個子集合.

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

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

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

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

樣例1輸入:

7輸出:

4自己推的話可以先看出 n = 6 和 n = 7 的時候是沒有相關性的;

我們用dp的思想來想 , 所謂求誰設誰;

我們設dp[i][j] i 表示 1 到 i ,j 表示 和為 j 的種類有多少;

先分種類 總數和為奇數的時候 輸出 0 這是大家能想到的;

當 i > j 的時候 因為 i > j 所以加不加上 j 都不會有多出來的情況 所以dp[i][j] = dp [i - 1][j]l;

當 i == j 的時候 i 剛好為 j 所以多出一種 所以dp[i][j] = dp[i - 1][j] + 1;

重點當i < j 的時候 會有j - i 加上 i 從而 == j 所以dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i];就是加上前面 變成 j - i 有多少種類 ;

此時**的大致思想就已經出來了 下面我貼上程式;

#includeusing namespace std;

int main()else if(i == j)else

}} cout《還有一種dfs思想超時的 僅僅提供給大家思路用

#includeusing namespace std;

int n;

int summ = 0;

int h = 0;

void dfs(int t,int sum)

if(sum > summ - sum) return;

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

}int main()

if(n <= 2) cout<< 0;

else

cout<} return 0;

}

計蒜客 等和的分隔子集

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

計蒜客 節食的限制(01揹包)

bessie像她的諸多姊妹一樣,因為從farmer john的草地吃了太多美味的草而長出了太多的贅肉。所以fj將她置於乙個及其嚴格的節食計畫之中。她每天不能吃多過h 5 h 45,000 公斤的乾草。bessie只能吃一整捆乾草 當她開始吃一捆乾草的之後就再也停不下來了。她有乙個完整的n 1 n 5...

計蒜客 節食的限制(01揹包)

bessie像她的諸多姊妹一樣,因為從farmer john的草地吃了太多美味的草而長出了太多的贅肉。所以fj將她置於乙個及其嚴格的節食計畫之中。她每天不能吃多過h 5 h 45,000 公斤的乾草。bessie只能吃一整捆乾草 當她開始吃一捆乾草的之後就再也停不下來了。她有乙個完整的n 1 n 5...