/*
user: php
time: 1.340 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1071
*/
#include<iostream>
#include<cstring>
#define mem(x, y) memset(x, y, sizeof(x))
#define MAXX(x, y) (x>y?x:y)
using namespace std;
int N; //number of objects
int price[1002];
int weight[1002];
int dp[1002][102];
int capacity;
int rec(int i, int w)
{
if(i>=N) return 0;
if(dp[i][w] != -1)
{
return dp[i][w];
}
int r1, r2;
if(w + weight[i]>capacity)
{
r1 = 0;
}
else
{
r1 = price[i] + rec(i+1, w+weight[i]);
}
r2 = rec(i+1, w);
dp[i][w] = MAXX(r1, r2);
return dp[i][w];
}
int main()
{
int cases;
int people;
int result;
cin>>cases;
while(cases--)
{
result = 0;
cin>>N;
for(int i=0; i<N; i++)
{
cin>>price[i]>>weight[i];
}
cin>>people;
for(int i=0; i<people; i++)
{
for(int i=0; i<1002; i++)
{
for(int j=0; j<102; j++)
{
dp[i][j] = -1;
}
}
cin>>capacity;
result += rec(0, 0);
}
cout<<result<<endl;
}
}
Another solution with coin change style(still using the idea of knapsack):
//time: 0.025 sec
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl
using namespace std;
#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
ASDF& operator,(int &a) {
sf("%d", &a);
return *this;
}
ASDF& operator,(long int &a){
sf("%ld", &a);
return *this;
}
ASDF& operator,(long long int &a){
sf("%lld", &a);
return *this;
}
ASDF& operator,(char &c){
sf("%c", &c);
return *this;
}
ASDF& operator,(double &d){
sf("%lf", &d);
return *this;
}
template<typename T>
ASDF& operator,(T &a){
cin>>a;
return *this;
}
}asdf;
struct ASDFG{
template<typename T>
ASDFG& operator,(vector<T> &v){
pf("[");
cout<<v[0];
FOR(i, 1, SZ(v)){
cout<<", "<<v[i];
}
pf("]");
return *this;
}
template<typename T>
ASDFG& operator,(T x) {
cout<<x<<" ";
return *this;
}
}asdfg;
//Header ends here
#define MAXX 32
int N, dp[32];
paii obj[1002];
int main()
{
int kases;
take(kases);
int w;
while(kases--)
{
take(N);
//total N object
loop(i, N)
{
take(obj[i].fr, obj[i].sc);
}
mem(dp, 0);
loop(i, N)
{
w = obj[i].sc;
for(int j=31-w; j>-1; j--)
{
dp[w+j] = max(dp[w+j], dp[j]+obj[i].fr);
}
}
FOR(i, 1, 32)
{
dp[i] = max(dp[i], dp[i-1]);
}
take(N);
ll res = 0;
loop(i, N)
{
take(w);
res += dp[w];
}
pf("%lld\n", res);
//dump(res);
}
return 0;
}