【NOIP2006】【Luogu1060】开心的金明(01背包模板)

problem

  • 有n个物品,价格为wi, 重要度为vi。
  • 在代价不超过m的情况下,最大化wi*vi的值
  • n < 30, m < 3e4

solution

Qwq,Wi*Vi是确定的。
所以vi *= wi;之后,,,就是一个01背包。
——
f[i]表示剩余体积为i时能获得的最大价值
决策过程可以选或者不选。
更多见背包九讲?
复杂度O(mn)

codes

#include<iostream>
using namespace std;
const int maxn = 40;
int v[maxn], w[maxn], f[50005];
int main(){
    int n, m;  cin>>m>>n;
    for(int i = 1; i <= n; i++){
        int x, y;   cin>>x>>y;
        w[i] = x;  v[i] = x*y;
    }
    for(int i = 1; i <= n; i++)
        for(int j = m; j >= w[i]; j--)
            f[j] = max(f[j], f[j-w[i]]+v[i]);
    cout<<f[m]<<'\n';
    return 0;
}
posted @ 2018-07-24 09:33  gwj1139177410  阅读(131)  评论(0)    收藏  举报
选择