アルゴリズムが簡単なナップザック問題

以前は「是非、この質問を見てください

それは「そうです、オンラインで答えがあります!

あなたが考える限り、あなたはあなたの脳の中で何かになることができます。それで、あなたは思いましたか?

ディレクトリ

トピック-単純なバックパックの問題

タイトルの説明

入力

アウトプット

入力例

出力例

問題解決

完全なコード

 関連するトピック


 

トピック-単純なバックパックの問題

タイトルの説明

 

アイテムS、既存のnアイテムの重量を入れることができるバックパックがあり、重量はw1、w2、w3、... wnです。 

重量の合計が正確にSになるように、バックパックに入れるこれらのnアイテムのいくつかを選択できるかどうか尋ねます。 

条件を満たす選択肢がある場合、バックパックに解決策があります。それ以外の場合、バックパックの問題には解決策がありません。

 

入力

配置されたアイテムの重みがs、アイテム数n、各アイテムの重みを含む複数行の入力データがあります(入力データはすべて正の整数です)

テストデータの複数のセット。

アウトプット

各テストインスタンスについて、条件が満たされている場合は「YES」を出力し、条件が満たされていない場合は「NO」を出力します。

入力例

20 5
1 3 5 7 9

出力例

YES

 タイトルリンク


問題解決

動的プログラミングのアイデアを使用して、重み[1 ... n]は各オブジェクトの重みを表すために使用されます。複数のオブジェクトが選択された後、オブジェクトの重み[m]がsの合計重みを満たすために追加され、次にs-重み[ m]は、以前に選択したオブジェクトの重みの合計に等しくなります。この操作を繰り返すと、sはs-weight [m]になり、オブジェクトの数は元のオブジェクトに基づいて1つ減り、選択したオブジェクトは重みの重み[ n]。したがって、再帰を使用して、条件が満たされているかどうかを判断できます。

if(packet(s - weight[n - 1], n - 1)){
		return true;
	}
else return packet(s,n - 1);

もちろん、選択した行ではない重み[m]の前のオブジェクトに遭遇するので、このオブジェクトをスキップして判断してください。

完全なコード

#include<iostream>
using namespace std;
int weight[1000];
bool packet(int s,int n){
	if(s == 0) return true;
	if(s < 0 ||(s > 0 && n < 1)){
		return false;
	}
	if(packet(s - weight[n - 1], n - 1)){
		return true;
	}
	else return packet(s,n - 1);
}
int main(){
	int s, n;
	while(cin>>s>>n){
		for(int i = 0; i < n; i++){
			cin>>weight[i];
		}
		if(packet(s,n))
			cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

 関連するトピック

前:アルゴリズム-コイン交換(コインの最小数)

 


一部のアルゴリズムを理解していない場合は、それは正常です。しばらくスマートフォンで遊んで、理解に集中する必要があります(はい、数十分!もちろん、Xiaobaiを使い始めるためです)。また、「とても簡単です!」-リン

19件の元の記事を公開 239 件を賞賛 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/qq_45703420/article/details/105452823