还是一个背包问题。只是在这里需要计算的价值变成了每件物品的价格与重要度的乘积。
但是由于价格和重要度的乘积的总和较大,所以采用离散化的方式去减少空间。由于没有结果的不需要记录,如果当前选的结果还没有之前没选的大也不用更新。
使用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;
}