コンニャク水最初の髪のブログは、テンプレートのタイトル拷問午後です(笑)
羅区P1060
コードは以下の通りであります:
書式#include <cstdioを> する#include <iostreamの> の#include <アルゴリズム> 使用して 名前空間をSTD。 INT chengji [ 100000000 ]、jiage [ 30 ]、jiazhi [ 30 ]。 整数 N、M。// N为钱数、M为个数 INTメイン(ボイド){ CIN >> N >> M。 用(INT iは= 0 ; I <M、I ++ ){ CIN >> jiage [I] >> jiazhi [I]。 jiazhi [I] = jiage [I] * jiazhi [i]は、 } のための(INT I =0 ; I <M、I ++ ){ ため(INT J = N-; J> = [I] jiage; J、){ Chengji [J] = MAX(Chengji [J]、Chengji [J-jiage [I] + jiazhi [I]); } } COUT << Chengji [N-]; 戻り 0 ; }
これは理解を容易にするために最適化された一次元アレイである、(問題のロス溶液からバレー)2次元アレイを貼り付け
書式#include <iostreamの> 使用して名前空間はstdを、INT F [ 30 ]、[ 100000 ]。 INT [W 10000 ]。 int型の V [ 10000 ]; int型のmain() { int型のn、mは、 int型I、J、K。 CIN >> M >> N。 // 提前相乘ため(iは= 1 ; I <= N; I ++ ) { CIN >> W [i]は>> V [i]は、 V [i]は * = W [i]は、 } のための(INT I = 1 ; I <= N; I ++ ) { // リュックサックバックパックは全く異なる最も重要な場所のバックパック01、繰り返し同一の記事に適用防止するために、必要が後方検索する、01 のために(INT C = 0 ; C < = M; C ++ ) { F [I] [C] = F [I- 1 ] [C]; IF(C> = W [I]) F [I] [C] = MAX(F [I] [C ]、F [I- 1 ] [CW [I] + V [I]); } } COUT << F [N-] [M]; 戻り 0 ; }
最後のビット番号i(1 <= l <= M)の方法の生成物は、異なる出発点以外は、最大値をとることができるとき、一次元アレイおよび二次元アレイは、物品の二つの方法です。
(0 <= jの<= n)がとり得る最大の積にJの残りの容量を計算し、オブジェクトのシーケンス番号iの二次元アレイの最後のある考え、
残りを取得する方法、バッグ内に一次元アレイは、i番目の項目ものとする考えが最大をとることができます。
私はそうストライキを行い、再帰的な方法でスタートを作りたいが、表現のバックパックのスペースの制限を見つけることができません。
2020フラグを設立、再びそれを行うには、再帰的な方法で問題を置くXD