-01ベーシスリュックサックナップザック問題

この記事を読む前に、それは特定のDPの基礎を持っていることが最善です。

トピックリンク:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1712 

あなたはバックパックのベアリング重量mを持っている、との項目を保持することができますバックパックで最大の価値を見つけ、あなたの体重とn個の項目の値を与えることを単に意味。

このような質問は、報告書に与えられた説明のように、一定のテンプレートを持っています。次に、私はこの報告書を問う問題を解決するには、例えば、問題のアイデアを分析します。

まずリリース状態遷移式:DP [J] = MAX(DP [J]、DP [JW [I] + V [i])と

バックパック10の容量は、4つの項目の合計、それぞれ4条、(2,1)、(3,3)、(4,5)の加重値、(7,9):ルックデータは、トピックを与え。

まず、与えられた場合にはバックパックに入れて、各記事のバックパックの容量、およびない、2つのオプションがあります。バックパック、バックパックの容量低下、中項目は値ではなく、バックパックの中に、同じ容量の値を追加した場合。

提供される容量バックパックM、W [i]を表すI-重量アイテム、V [i]を示し、商品、DP [J]のi番目の要素の値は、物品の選択ラウンドアイテムのiがjのナップザックバックパック最大容量値後の時間を表します。

今、我々は、(下記参照)の表があると仮定し、表の最後の行は、Iラウンド商品選択後にバックパックと最大容量値の各々に対する最後のものであるので、バックパックは、このテーブルの上に有することができる(与えられます。答)。図の位置は、3つの項目を選択する(3,3)、(4,5)、(2,1)を介して、5の赤いバックパック容量で表され、バックパックは、最大値を有することができます。レッドは、すなわちDP [5]の値は、今、私たちがしなければならない、未知のないバックパックの中へ(4,5)どの項目に選択することで、未知の値の位置を取ります。あなたは置いていない場合は、我々は3ラウンドの選択後、または選択DP [5]の最初の2ラウンドの後に使用可能な場合、最大値による今回のアイテムを選択するには、左バックパックの容量を置くことができます。あなたが入れた場合は、バックパックの容量は、5-4 = 1に低減され、それが項目の前に置か第三に相当し、バックパックの容量は一つだけ、または1つだけを提供され、滞在する4つのバックパックの容量の残りのためにバックパック内のアイテムの最大値が選択DP 2ラウンドの後に等価であり、このときに、現在のラウンドを選択し、[1] +5が、DP値の後に選択2ラウンド後に[1]〜私たちに知られています。そう状態テーブルの何れかのために、我々は、DP [J] = MAX(DP [j]を有するこのように、容易に入手可能なDP [5] = MAX(DP [5]、DP [5-4] +5) DP)+ V [i]は[I] [JW]は、[I] [JW]式DP [j]の値DPを理解する権利の値です。

2.次に、我々は上記の考え方に基づいているか、プログラムが最終DPを再生するには、テーブルの上に行く[10]答えは、問題レポートの解決策を参照してください。

#include <bits/stdc++.h>

using namespace std;
int w[500],c[500],dp[500];
int v,n;
int main()
{
   cin>>v>>n;             //输入背包容量和物品数量
   for(int i=1;i<=n;i++)
   cin>>w[i]>>c[i];       //将物品重量和价值存入数组
    
   //memset(dp,0,sizeof(dp);

   for(int i=1;i<=n;i++)
   for(int j=v;j>=w[i];j--)
   dp[j]=max(dp[j],dp[j-w[i]]+c[i]);


    cout <<dp[v] << endl;
    return 0;
}

我々はMAX()を決定するためにのみ使用されるので、まずこの質問のためのすべての、あなただけの一次元配列のDPを必要とする、[]、することができたときに前の選択の結果。

私は、プロセスの中央部には、テーブルを打つことです空にする。最初のサイクルは、問題を説明するためにforループ秒を監視する前に、選択された項目のためであるということであるn回、実際には、] [配列DPの前にテーブルをヒットする必要があり、0に初期化するが、C ++アレイデフォルトので、割り当てられていないことです0に初期化され、第1の選択時に理解するために、省略され、最後のDPは、[]の値はゼロです。私たちは、第二サイクルを探して、第二サイクルはでプレイメートルまでの1からバックパックの容量値のためです。ことを理解するには、次の値のDPを取得するので、ループのための第二は、バックパックの最大容量から始めるべきである[X]はDPの前の値[x]の時間を使用します。あなたは小さな開始し、価値を起動した場合、その結果は、選択の結果を説明します。場合jは、<バックパックの瞬間容量は、この記事に合わないと判断されたこと[i]の手段wが、それは、最後の結果への直接の後継再決意する必要がない、ので、第二に、<W [i]は、jの前に終了すべきですこのような状況が発生する可能性がDP [負]を測定しました。

3. [OK]を、今、すべての完成コンテンツ。おそらく、これとあなたが見る他のチュートリアルインターネット上の彼らは2桁のグループを使用して、状態遷移方程式までトップ推論の方法を使用しているため使用される方法は、多少異なりますが、その後の言葉は、このアプローチを導入することであってもよいです。また、私はプロセスで発生した問題のすべて私自身の理解を入れているので、我々は問題が発生する可能性があると私は、私はいくつかの長いったらしいの話だと思うので、私たちは、アウト列挙されている、とあなたが理解していないものがある場合は、メッセージのああを残してください。

公開された34元の記事 ウォン称賛26 ビュー10000 +

おすすめ

転載: blog.csdn.net/sinat_40471574/article/details/89740300