就是简单的背包,我是把W, V输入反了,导致一直输出都是0,一直改了好久。
思路 G 一共才 30,打表的思想,将所有情况用f数组记录,最后 ans+=f[mw],用了滚动数组。
// File Name: UVa10130.cpp
// Author: Toy
// Created Time: 2013年04月15日 星期一 17时42分16秒
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <utility>
#include <bitset>
#define L(x) x << 1
#define R(x) x << 1 | 1
using namespace std;
int Case, V, W, num, mw, cnt, f[1010];
int main ( ) {
cin >> Case;
while ( Case-- ) {
cin >> cnt;
memset ( f, 0, sizeof ( f ) );
for ( int i = 1; i <= cnt; ++i ) {
cin >> W >> V;
for ( int j = 30; j >= 0; --j )
if ( j >= V ) f[j] = max ( f[j], f[j - V] + W );
}
int ans = 0;
cin >> num;
for ( int i = 1; i <= num; ++i ) {
cin >> mw;
ans += f[mw];
}
cout << ans << endl;
}
return 0;
}