ブルーブリッジカップ学習アルゴリズムの質問スタンプ

審査学習アルゴリズムスタンプ

リソース制約
制限時間:1.0秒メモリ制限:512.0メガバイトの
説明問題
  Nとエンベロープ(1≤N≤100)位置指定されたスタンプすることができ、各位置は、スタンプを耐えることができます。現在、X1の金種にM(M <= 100)は、異なる切手、X2 ... .Xm点(Xiは、1≤Xi≤255整数である)、N張とのそれぞれを有しています。

貼り付けられた分(X1、X2、...、Xmの)ことができる封筒に切手を明らかに、最小値、最大値はN * MAX(X1、X2、...、Xmの)です。郵便料金の値の連続配列に1から最大値を得るために必要ならば一組を形成することができるペースト法により得られた全ての郵便料金の値は、(重複の設定値がある)、出力シーケンスは、このセットに存在しません。

例えば、N = 4、M = 2 、 4点、1点の金種は、従って配列1,2,3,4,5,6,7,8,9,10,12,13,16を形成し、そして送料から始まる連続した配列は、1,2,3,4,5,6,7,8,9,10、10分の送料連続シーケンスの最大値です。
入力フォーマット
  最初のライン:N貼り付け切手シートの最大数、2行目:スタンプの数Mの種類、三行:Mデジタルスペースで区切られ、西スタンプ額面値を示します。注:Xiは必ずしも順序付けられたシーケンスのサイズではありません!
出力フォーマット
  最大値MAXを開始送料の連続配列から。(すなわち、1分でスタンプ金種を入力されていない)の存在下、場合ポイントの配列から出発して、出力0
サンプル入力
サンプルA:
4
2
4 1。
サンプルII:
10
。5
2 8 6 10 4

サンプル出力

サンプルA:
10
サンプルII:
0

考える:あなたは、それは非常に複雑になることが多くの不必要な計算を計算する方法を習得していない、との回答が正しくない場合は、この質問は、右の方法を選択することが重要です。まず、私たちは、その後、それぞれが次の計算に便利なの配列で、すべてを降ろす必要があるどのように多くの位置の数から計算した保存された第1の数、最初の数は1つの試合のとき、条件を満たす能力、することができ、および計算ステップを大幅に節約することができかつ迅速、正確、どのように多くの切手とどのように多くのポジションでこの数を引くたびに(利用可能占有する必要がある必要が7を補うためになるタイトルは、= 7,7の前に11-4の記録を持っていたようなそして4 1 3、プラス4を追加する11の必要性)、位置を占めるようにタイトルが5、N = 4よりも大きいこと、条件を満たしていない、スタンプの位置を決定するための条件が与えられた位置よりも、またはより多くによって占有満たしていません与えられた範囲内の番号へのシーケンス番号がスタンプ位置が適格ではないではありません。

コードは以下の通りであります:

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	int a[101],b[255001],c,i,j,n,m;  //255001为可能出现的最大值
	memset(b,0,sizeof(b));
	cin>>n>>m;
	for(i=0;i<m;i++){
		cin>>a[i];
	}
	for(i=0;i<m;i++){           //给邮资排序 
		for(j=0;j<m;j++){
			if(a[i]<a[j]){
				int t;
				t=a[i];a[i]=a[j];a[j]=t;
			} 
		}
	}
	for(j=1;j<=a[m-1]*n;j++){  //最大值即为最大的数乘n
		for(i=m-1;i>=0;i--){
			if((b[j]==0 || b[j-a[i]]<b[j]) && j>=a[i]){  //b[j-a[i]]<b[j]选取最少的占用位置数
				b[j]=b[j-a[i]]+1;
			}
		} 
		if(b[j]==0 || b[j]>n){
			cout<<j-1;
			break;
		}
	}
}
公開された51元の記事 ウォン称賛47 ビュー2010

おすすめ

転載: blog.csdn.net/weixin_45269353/article/details/104557530