USACO TRAINING 子集的和

2021-08-07 08:18:22 字數 1216 閱讀 1566

時間限制: 1 sec  

記憶體限制: 64 mb

對於從1到n (1 <= n <= 39) 的連續整數集合,能劃分成兩個子集合,且保證每個集合的數字之和是相等的。

舉個例子,如果n=3,對於能劃分成兩個子集合,他們每個的所有數字和是相等的:

and

這是唯一一種分法(交換集合位置被認為是同一種劃分方案,因此不會增加劃分方案總數)

如果n=7,有四種方法能劃分集合,每一種分發的子集合各數字和是相等的:

和      1+6+7=2+3+4+5

和 和

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

第1行:乙個整數n

第1行:輸出劃分方案總數,如果不存在則輸出0。

(如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)

7

4

#include

long long num[50][10000],i,n,s,j;

int main()

s/=2;

for(i=1;i<=s;i++)

num[0][i]=0;//0個數拼湊出和為i,0為邊界值,因為沒有可能,乙個方案數都沒有

for(i=0;i<=n;i++)

num[i][0]=1;//i個數拼湊出和為0,1為邊界值,模擬如上

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

for(j=s;j>=1;j--)

if(j>=i)//求得前i個元素拼湊出和為j的最多方案個數

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

else

num[i][j]=num[i-1][j];

printf("%lld\n",num[n][s]/2);//最後儲存到的數為兩邊的

}另一種,用滾動陣列:

#include

long long num[405];

int main()

num[0]=1;s/=2;

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

for(int j=s;j>=i;j--)//求得並儲存前i個元素拼湊出和為j的最多方案個數

num[j]=num[j]+num[j-i];

printf("%lld\n",num[s]/2);//最後儲存到的數為兩邊的

}

USACO TRAINING 奶牛家譜

時間限制 1 sec 記憶體限制 64 mb 提交 53 解決 24 提交 狀態 我的提交 農民約翰準備購買一群新奶牛。在這個新的奶牛群中,每乙個母親奶牛都生兩小奶牛。這些奶牛間的關係可以用二叉樹來表示。這些二叉樹總共有n個節點 3 n 200 這些二叉樹有如下性質 有多少不同的家譜結構?如果乙個家...

USACO training 做題記錄

字串處理,把飛碟和組名的編號記下來,比一下就行了 c code includeusing namespace std int main for int o 0 o k money num int give 給每個人的錢數 if num 0 else while num for int i 0 i真 ...

usaco training 1 3奶牛回文

據說如果你給無限只母牛和無限臺巨型可攜式電腦 有非常大的鍵盤 那麼母牛們會製造出世上最棒的回文。你的工作就是去尋找這些牛製造的奇觀 最棒的回文 在尋找回文時不用理睬那些標點符號 空格 但應該保留下來以便做為答案輸出 只用考慮字母 a z 和 a z 要你尋找的最長的回文的文章是乙個不超過 20,00...