P1060 [NOIP2006 普及组] 开心的金明
分析
将原问题作如下转化
- 总钱数相当于背包容量 m m m;
- 每件物品的价格相当于体积 v v v;
- 每件物品的价格乘以重要程度相当于价值 w = w [ i ] ∗ v [ i ] w= w[i]*v[i] w=w[i]∗v[i] ;
那就就转化为了经典的 01 背包问题了。
时间复杂度
01 背包 的时间复杂度就是 O ( n m ) O(nm) O(nm),其中 n n n 是物品数量, m m m 是背包容量。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 30, M = 30050;
int f[M], n, m, w[N], v[N];
int main() {
cin >> m >> n;
for (int i = 1; i <= n; i++) { // 物品
cin >> w[i] >> v[i];
for (int j = m; j >= w[i]; j--) { // 容量
f[j] = max( f[j], f[j - w[i]] + (v[i] * w[i]) );
}
}
cout << f[m] << endl;
return 0;
}