还是一个背包问题。只是在这里需要计算的价值变成了每件物品的价格与重要度的乘积。
但是由于价格和重要度的乘积的总和较大,所以采用离散化的方式去减少空间。由于没有结果的不需要记录,如果当前选的结果还没有之前没选的大也不用更新。
使用map去保存从而减少的空间。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 30;
struct Node {
int price;
int importance;
int total = price*importance;
};
//做一个离散化的处理
map<int, int> dp;
int N, m;
Node a[maxn];
int main() {
cin>>N>>m;
for (int i=1;i<=m;i++) {
cin>>a[i].price>>a[i].importance;
a[i].total = a[i].price*a[i].importance;
}
for (int i=1;i<=m;i++) {
for (int j=N;j>=0;j--) {
if (j>=a[i].price) {
if (dp[j-a[i].price]+a[i].total > dp[j]) {
dp[j] = dp[j-a[i].price]+a[i].total;
}
}
}
}
map<int, int>::iterator it = dp.end();
it--;
cout<<(*it).second;
return 0;
}

京公网安备 11010502036488号