C++動的計画アルゴリズムのサブセットの和
1403 ワード
サブセットの和
タイトルの説明
1からN(1<=N<=39)までの連続整数集合については、2つのサブ集合に分割することができ、各集合の数字の和が等しいことを保証することができる.
例えば、N=3の場合、{1,2,3}は2つのサブセットに分割され、それぞれのすべての数字は等しい:{3}and{1,2}これは唯一の分割法である(交換集合位置は同じ分割スキームと考えられるため、分割スキームの総数は増加しない)
N=7の場合,集合{1,2,3,4,5,6,7}を区別する4つの方法があり,各配布されたサブ集合の各数値和は,{1,6,7}と{2,3,4,5}1+6+7=2+3+4+5{2,5,7}と{1,3,4,6}と{1,2,5,6}{1,2,4,7}と{3,5,6}
Nを与えて、あなたのプログラムは分割スキームの総数を出力すべきで、このような分割スキームが存在しないならば、0を出力します.
入力
1行目:整数N
しゅつりょく
1行目:分割スキームの合計数を出力し、存在しない場合は0を出力します.
サンプル入力
サンプル出力
コード#コード#
コードは次のとおりです.
タイトルの説明
1からN(1<=N<=39)までの連続整数集合については、2つのサブ集合に分割することができ、各集合の数字の和が等しいことを保証することができる.
例えば、N=3の場合、{1,2,3}は2つのサブセットに分割され、それぞれのすべての数字は等しい:{3}and{1,2}これは唯一の分割法である(交換集合位置は同じ分割スキームと考えられるため、分割スキームの総数は増加しない)
N=7の場合,集合{1,2,3,4,5,6,7}を区別する4つの方法があり,各配布されたサブ集合の各数値和は,{1,6,7}と{2,3,4,5}1+6+7=2+3+4+5{2,5,7}と{1,3,4,6}と{1,2,5,6}{1,2,4,7}と{3,5,6}
Nを与えて、あなたのプログラムは分割スキームの総数を出力すべきで、このような分割スキームが存在しないならば、0を出力します.
入力
1行目:整数N
しゅつりょく
1行目:分割スキームの合計数を出力し、存在しない場合は0を出力します.
サンプル入力
7
サンプル出力
4
コード#コード#
コードは次のとおりです.
#include<iostream>
using namespace std;
long long num[50][10000];
int n,QAQ;
main()
{
cin>>n;
QAQ=(n*(n+1))/2;
if(QAQ%2)
{
cout<<"0"<<endl;
return 0;
}
for(int i=1;i<=QAQ/2;i++) num[0][i]=0;
for(int i=0;i<=n;i++) num[i][0]=1;
for(int i=1;i<=n;i++)
for(int j=QAQ/2;j>=1;j--)
num[i][j]=j>=i?num[i-1][j]+num[i-1][j-i]:num[i-1][j];
cout<<num[n][QAQ/2]/2<<endl;
}