[デジタル] USACOは `下位桁を三角形...
タイトル説明
FJと彼の牛は精神的なゲームを楽しみます。彼らは、特定の順序で11からN(1 \ルN \ル10)N(1≤N≤10)に番号を書き留め、次いで、1つの少ない数の新しいリストを生成するために、隣接する数字を合計します。彼らは、単一の番号が残されるまで、これを繰り返します。例えば、ゲームの1つのインスタンス(ときN = 4N = 4)のように行くかもしれません:
3 1 2 4
4 3 6
7 9
16
FJの背中の後ろに、牛は、彼らが唯一の最終合計と数NNから始まる配列を決定しようとするより困難なゲームを、プレイし始めています。残念ながら、ゲームは少しFJの暗算能力を超えています。
FJは、ゲームをプレイし、牛に追いつく支援するプログラムを書きます。
そのようなAのゲームがあります:
a_iを、明らかに少ないシーケンス長より各配列を構成する、Nに1を書き込み、隣接する二つの数字一緒に、新しいシーケンスを構成し、そのような操作の新しい配列に配置されました1、一つだけ桁まで。次に例を示します。
3,1,2,4
4,3,6
7,9
16
最後に、16などのAフィギュア付き。
後方今あなたがNを知っていれば、このようなゲームをプレイしたデジタル和の大きさを知りたい、あなたは元のシーケンスaiを見つけ、N.への順列1 いくつかの可能な答え、出力辞書順最小のものがある場合。
管理者注:このトピックでは、エラーを説明し、ここではそれが1,2,3,4,5,6,7,8,9,10,11,12を指し、辞書式
代わりに1,10,11,12,2,3,4,5,6,7,8,9
入力形式
2つの正の整数nは、合計。
出力フォーマット
出力は1行が含まれ、最小の順序は辞書がその答えです。
いいえソリューション、してください出力は何もありません。(グッド素晴らしいああ)
サンプル入力と出力
コピー入力#1
416
の出力#1コピー
3124
プロンプト説明/
データ、n≤7の40%を、
データ、n≤10の80%。
データの100%、n≤12、sum≤12345へ。
分析
まず、試料法律の値を見:
3 1 2 4
4 3 6 3 + 1 = 4; // 3 = 1 + 2、4 + 2 = 6;
79 @ 7 = 3 + 1 + 1 + 2。 9 = 1 + 2 + 2 + 4;
16 // 16 = 3 + 2 + 1 + 1 + 1 + 2 + 4 + 2;
最初の行1と1との三回、2で3回1時間で3、4。:16 = 3 1 + 1 3 + 2 3 + 4。1;
(1,3,3,1)であるパスカルの三角形を行う第4行されていません、。
パスカルの三角形:(次の2つの数値が左右および上側に等しい)
1。
1. 1。
1 2 1。
1. 1. 3. 3。
したがって、この問題は、まずパスカルの三角形の値を構築するまで保存し、深い検索を行います。具体的にコードとコメントを見てください。
コード
#include<iostream>
using namespace std;
int n,sum;
int y[20][20]; //杨辉三角
bool vis[20]; //是否用过
int a[20]; //存放数据
bool f;
void dfs(int k,int s){
if(s > sum || f ){ //如果累加的s超过了sum,就返回
return ;
}
if(k > n){ //如果k等于n,
if(s == sum){ //s等于sum,就输出a【】
cout<<a[1];
for(int i=2;i<=n;i++){
cout<<" "<<a[i];
f = 1;
}
}
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i] = true; //标记成用过
a[k] = i; //保存第k个取的数
dfs(k+1,s+ y[n][k]*i); //要乘上杨辉三角对应的数值。
vis[i] = false;
}
}
}
int main(){
cin>>n>>sum;
//生成杨辉三角
y[1][1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
y[i][j] = y[i-1][j-1] + y[i-1][j];
}
}
//1表示 1到n
//0表示 累加,到sum时
dfs(1,0);
return 0;
}