ssl2655 集合問題

2021-08-19 15:27:26 字數 1181 閱讀 7946

集合問題

對於從 1 到 n (1 <= n <= 39) 的連續整數集合,能劃分成兩個子集合,且保證每個集合的數字和是相等的。舉個例子,如果 n=3,對於能劃分成兩個子集合,每個子集合的所有數字和是相等的: 和 ,這是唯一一種分法(交換集合位置被認為是同一種劃分方案,因此不會增加劃分方案總數)如果 n=7,有四種方法能劃分集合,每一種分法的子集合各數字和是相等的:

和 和 和 和

給出 n,你的程式應該輸出劃分方案總數,如果不存在這樣的劃分方案,則輸出 0。程式不能預存結果直接輸出。

從檔案 subset.in 中讀入資料,檔案只有一行,且只有乙個整數 n(1 <= n <= 39)

結果輸出到檔案 subset.out 中,輸出劃分方案總數,如果不存在則輸出 0。

本題算dp吧?f[i]表示和為i的方案總數*2(程式中會把2+3和3+2分別計算一遍)

題目要求各集合的和都相等,其實這個和是有規律的:和=2n。這裡,我們可以用高斯的思維來解決此題(1+100=2+99,都是個定值),故這個集合可以分為很多組。但由於不能出現f[m]不是2的倍數的情況(明明是方案總數*2,為什麼是奇數啊?!),所以要判斷

本題用深搜應該是會爆的,而考慮到f[i]表示和為i的方案總數*2,為什麼我們不可以用f[3]+f[4]去更新f[7]呢?這樣我們就可以得出答案了

這裡引入一位大佬的理念(出自洛谷題解):本題是求能裝滿(1+2+3+…+n)/2的大小的揹包的方案總數。

var

f:array[0..1000]of int64;//必須用int64,不然會爆

n,m,i,j:longint;

begin

read(n);

m:=n*(n+1) div

2;//方案總數

if m mod

2<>0

then

write(0)

else

begin

m:=m div

2;//集合的和

f[0]:=1;//先初始化

for i:=1

to n do

for j:=m downto i do

f[j]:=f[j]+f[j-i];//更新

write(f[m] div

2); end;

end.

2 7 集合劃分問題

問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當 n 4 時,集合可以劃分為 15 個不同的非空子集如下 程式設計任務 給定正整數 n,計算出 n 個元素的集合可以劃分為多少個不同的非空子集。資料輸入 由檔案 input.txt 提供輸入資料。檔案的第 1 行是元素個數 n。結果輸出 程...

9409 集合的劃分問題

time limit 3 second memory limit 2 mb 問題描述 n 個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 其中,集合 由1 個子集組成 集合,由2 個子集組成 集合,由3 個子集組成 集合,由4 個子集組成。程式設計...

python3集合 Python3 集合

集合 set 是乙個無序的不重複元素序列。可以使用大括號 或者 set 函式建立集合,注意 建立乙個空集合必須用 set 而不是 因為 是用來建立乙個空字典。建立格式 parame 或者set value 這裡演示的是去重功能 orange in basket 快速判斷元素是否在集合內 true c...