题解
如果把 N 视为一个背包的容量,m 为物品数,
vi
,
wi∗vi
分别为物品的体积和价值,这便是一个纯粹的01背包问题。
用滚动数组计算。
#include <iostream>
#include <cstdio>
#include <string>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 30000 + 10;
const int maxm = 30;
int dp[maxn];
int n, m;
int v[maxm], w[maxm];
void dpSolve()
{
memset(dp, 0, sizeof(dp));
for(int i = 0; i < m; ++i)
{
for(int j = n; j >= v[i]; --j)
{
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
}
}
cout << dp[n] << endl;
}
int main()
{
//fstream cin("data.in");
int t;
for(cin >> t; t--; )
{
cin >> n >> m;
for(int i = 0; i < m; ++i){
cin >> v[i] >> w[i];
w[i] *= v[i];
}
dpSolve();
}
return 0;
}