[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
01ナップサック問題その2
重さと価値がそれぞれw[i],v[i]であるようなn個の品物があります。これらの品物から、重さの総和がWを超えないように選んだときの、価値の総和の最大値を求めなさい。※制約
・1≦n≦100
・1≦w[i]≦10^7
・1≦v[i]≦100
・1≦W≦10^9
<入力例>
4 5 // 4...n(品物の数)、5...W(最大の重さ)
2 3 // 1番目の品物のw,v
1 2 // 2番目の品物のw,v
3 4 // 3番目の品物のw,v
2 2 // 4番目の品物のw,v
<出力例>
7
※※若干問題を書き換えている箇所がありますが、問題内容自体は同じです。
#include <iostream> #include <algorithm> using namespace std; #define MAXN 100 #define MAXV 100 #define INF (1<<21) int w[MAXN], v[MAXN]; int n, W; main() { while(cin >> n >> W && n && W) { int d[MAXN+1][MAXN*MAXV+1]; for(int i = 0; i < n; i++) cin >> w[i] >> v[i]; for(int i = 0; i < n; i++) for(int j = 0; j < MAXN*MAXV+1; j++) d[i][j] = INF; d[0][0] = 0; for(int i = 0; i < n+1; i++) { for(int j = 0; j < MAXN*MAXV+1; j++) { d[i+1][j] = min( d[i][j], d[i][j-v[i]]+w[i] ); } } int res; for(int i = 0; i < MAXN*MAXV+1; i++) { if(d[n][i] <= W) { res = i; } } cout << res << endl; } }こんな感じ。これで19min。
COMMENT