3 子集和問題

2021-08-18 00:18:52 字數 1127 閱讀 5942

對於由從1到n (1 <= n <= 39)這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。

例如,n=3時,可以將集合 分為和。此時稱有一種方式(即與順序無關)。

n=7時,共有四種方式可以將集合 分為兩個部分和相同的子集合:

和 和

和 和

輸入:程式從標準輸入讀入資料,只有一組測試用例。如上所述的n。

輸出:方式數。若不存在這樣的拆分,則輸出0。

輸入

7
輸出

4
參考

動態規劃例子

思路

dp[i][j]為前i個數的子集能構成和為j的種類數

狀態轉移方程為

dp[i][j]=dp[i-1][j]+dp[i-1][j-i] ,j>=i

dp[i][j]=dp[i-1][j] ,j

**

/*

dp問題

dp[i][j]為前i個數的子集能構成和為j的種類數

狀態轉移方程為

dp[i][j]=dp[i-1][j]+dp[i-1][j-i] ,j>=i

dp[i][j]=dp[i-1][j] ,j#include

using

namespace

std;

int main()

, num, b_sum, sum;

scanf("%d", &num);

sum = (1 + num)*num / 2;

b_sum = sum / 2;

if (sum % 2 == 1)

dp[0][0] = 1;

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

}printf("%d\n", dp[num][b_sum]);

return

0;}

子集和問題

題目描述 子集和問題的乙個例項為 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中的各元素之和等於c。題目出自 計算機演算法設計與分析 第3版 王曉東 思路 用回溯法解這道題,我本來想修改排列樹使之可以求出乙個集合的所有子集。但是分析了一下,時...

子集和問題

問題描述 子集和問題的乙個實力為。其中,s 是乙個正整數的集合,c是乙個正整數。判定是否存在s的乙個子集s1使得s1的和為c。輸入 輸入含多組測試用例!對每組測試用例,第一行有兩個正整數n和c,n表示s的大小,c是子集和的目標值。接下來的一行,有n個正整數 1 n 10000 表示集合s中的元素。當...

子集和問題

今天程式考試受挫,遂打算寒假空閒時間刷刷題,練練手感。今天有一題是這樣的,檔案 data.txt 有n 1行,每一行都為乙個正整數,第一行為n,剩餘n行為任意n個正整數。對於正整數m m 2 輸出m個數的和,要求和不大於100,並列出表示式 並且要求表示式不相同。若表示式中的元素相同則表示式就相同,...