01ナップザック問題動的プログラミング

0-1バックパック
説明
N(N <= 100)商品の種類やリュック所与。Iは、Wiの物品の重量、VIの値、ナップザック容量C(C <= 1000)です。Qは:バックパックにアイテムを選択する必要がありますどのように、各項目のバックパックへの項目の選択で最大の項目の合計値にバックパックには、私は二つの選択肢:?負荷または無負荷を持っています。私の記事は、記事の一部のみが私を充電することができない、いくつかの回をロードすることはできません。
入力
N + 1行の合計:;各ラインは、2件のデータが最初のI(1≤i≤n)メンバーを表し有し、次のn行最初の行nおよびcの値は、n個のアイテムとナップザック容量Cを表します。アイテムの重量と値。
出力
最大出力負荷バックパックアイテムの合計値。
 
サンプル入力1
5 10 2 6 2 3 6 5 4 4 6
サンプル出力1
15
 
 
分析:
  n個の項目があるN、Cは袋スペースです
 
  バックパックjの前方空間に選択したi番目の項目の提供DP [I] [j]は、最大負荷値、初期化:0境界は0に初期化され、回答DP [n]は[C]
  現在はJのJ> = obj_weightの下にインストールした場合は 、状態方程式:
  DP [I] [J] = MAX(DP [I  -  1] [j]は、DP [I  -  1] [J  -  obj_weight] + obj_price)。
  状態の電流Jフィット、方程式の場合:
  DP [I] [J] = DP [I - 1 ] [J]。
 
書式#include <iostreamの>
 使用して 名前空間はstdを、

#define NUM千int型DP [NUM] [NUM]。int型の最大値(int型int型B){
     返す > bは?A:B; 
} int型のmain(){
     int型 N; // N个物品int型の C; // 背包容量 
    CIN >> N >> C。
    INT   weight_price_table [ 100 ] [ 2 ]。以下のためにint型 i = 1 ; iが++; iが<= N ){ 
        CINを





    
    
    >> weight_price_table [I] [ 0 ] >> weight_price_table [I] [ 1 ]。
    } 
    
    // 初始化边界当I = 0、J = 0时DP = 0 
    のためにint型 i = 0 ; iはNUM <; iは++ ){ 
        DP [ 0 ] [I] = 0 ; 
        DP [I] [ 0 ] = 0 
    } 


    のためのint型 i = 1 ; iが<= N; iが++ ){
         ためINT J = 1 ; J <= C; J ++ ){
             int型 obj_weight = weight_price_table [I] [ 0];
            INT obj_price = weight_price_table [I] [ 1 ]。
            もし(J> = obj_weight){ // 如果装得下 
                DP [I] [J] = MAX(DP [I - 1 ] [j]は、DP [I - 1 ] [J - obj_weight] + obj_price)。
            } 
             { // 装不下 
                DP [I] [J] = DP [I - 1 ] [J]。
            } 
            
        } 
    } 

    COUT << DP [n]は[C]。



}

 

 

おすすめ

転載: www.cnblogs.com/likeghee/p/11770388.html