[デジタル] USACOは `下位桁を三角形...

[デジタル] 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;
}
公開された75元の記事 ウォンの賞賛1 ビュー3641

おすすめ

転載: blog.csdn.net/A793488316/article/details/104725066