シンプル
// 朴素二维 する#include <iostreamの> の#include <アルゴリズム> 使用して 名前空間をSTD。 const int型 N = 1010 ; 整数N、M。 INT V [N]、W [N]。 INT F [N]、[N]。 INT メイン(){ CIN >> N >> M。 以下のために(INT iが= 1 ; I <= N; I ++ ) CIN >> V [I] >> W [i]は、 以下のために(INT iが= 1 ; I <= N; I ++)// 装的个数 ため(INT= J 0、J <= M; J ++){ // 最大容量 // 言うのF [I] [J] Fに分割されている[I-1]、[J ]( i番目の除去)及びf [I-1] [JV [I] + W [i]は( i番目の除去最初、彼の品質を減じ、プラス) F [I] [J] = F [I- 1 ] [J]; // 左 // 右 // <J V [i]は、不在は、考えられなかったであろう 場合は(= V [I] F [I] [J] = MAX(F [I] [J]、F J)> [I- 1 ] [JV [I] + W [I]); } COUT << F [N-] [M] << ENDL; 戻り 0 ; }
最適化
// 次元最適化 する#include <iostreamの> する#include <アルゴリズム> 使用して 名前空間STD; constの 整数 N = 1010 ; INT N-、M; INT V [N]、W [N]; int型F [N]; int型メイン( ){ CIN >> N-Mであり; // mは時間を表し、n-表す数値 のための(INT I = 1 ; I <= N; I ++)CIN >> V [I] >> Wを[I]; のため(INT I = 1 ; I <= N; I ++ ) のための(INT J = M; J> = V [I]は、J -) F [J] = MAX(F [J]、F [J - V [I] + W [I])。 COUT << F [M]。 リターン 0 ; }