POJ 1276フルバックパック

サンプル入力

735 3 4 125 6 5 3 350 
633 4 500 30 6 100 1 5 0 1 
735 0 
0 3 10 100 10 50 10 10

サンプル出力

735 
630 
0 
0 

質問の意味:あなたは銀行カードの元の現金を持っていますし、ATMマシン、nはお金の宗派、お金nはそれぞれ数と額面の行があります。
  これは、裏返しATM機からの最も尋ねたどのくらいのお金です。

バックパックは完全に裸のです
が、私は実際に間違っています。
値のアイテムの現在の数が以上のバックパック*容量とき、彼は小から大への正のシーケンスを横断するとき、それはループのために、現在のアイテムの無限の数とみなすことができます。
場合は以下の記事01の数に等しいバイナリナップザックバックパック01は、ここで変換されます!

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム>
 使用して 名前空間はstdを、

int型の現金を、nは、
int型の C [ 15 ]、W [ 15 ]。
int型の DP [ 100005 ]。

無効 CompletePack(int型の C、INT ワット){
     場合(> =現金ワットのC *){ // 完全背包
        ためのint型 J =ワット; J <=現金; J ++ 
            DP [J] = MAX(DP [j]は、 DP [JW] + W)。
    }  {   // 多次01背包
        INT K =1 ;
        一方、(K < C){
             ためのint型 J =現金; J> = K * W; j-- 
                DP [J] = MAX(DP [J]、DP [JW * K] * W + K)。
            C - = K。
            K << = 1 
        } 
        のためのint型 ; J> = *のC W、J =現金j-- 
            DP [J] = MAX(DP [J]、DP [JW * C] + W * C)。
    } 
} 
int型のmain(){
     一方(scanf関数(" %D%dの"、および現金、&​​N)!= EOF){ 
        memsetの(DP、0はsizeof (DP))。
        以下のためにint型 i = 0 ; iがN <I ++は{)
            のscanf(" %d個の%のD "、&​​C [i]は、&Wは、[I]); 
        } 
        のためにint型 i = 0 ; iがn <; iは++ ){ 
            CompletePack(C [I]、W [I])。
        } 
        のprintf(" %d個の\ n " 、DP [現金])。
    } 
    戻り 0 
}
コードの表示

 




おすすめ

転載: www.cnblogs.com/kongbb/p/10939431.html