サンプル入力
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 。 }