以前は「是非、この質問を見てください!」
それは「そうです、オンラインで答えがあります!」
あなたが考える限り、あなたはあなたの脳の中で何かになることができます。それで、あなたは思いましたか?
ディレクトリ
トピック-単純なバックパックの問題
タイトルの説明
アイテム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を使い始めるためです)。また、「とても簡単です!」-リン