時間限制: 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...