声明 先粘一波代码,首先声明一下 这份代码是在 OI-wiki 的错误的示例代码 (错误有点多,我就不一一指出了) 上进行修改的,我知道有些人是从 OI-wiki 上跳转过来的,但是无奈于不会修改 OI-wiki ,所以在这里发一篇题解来帮助大家理解。 #include<bits/stdc++.h>
using namespace std;
const int maxn = 13010;
int n,M, W[maxn], v[maxn], f[maxn];
int main() {
cin>>n>>M;
for (int i = 1; i <= n; i++)
cin >> W[i] >> v[i];
for (int i = 1; i <= n; i++)
for (int l = M; l >= W[i]; l--)
if (f[l - W[i]] + v[i] > f[l]) f[l] = f[l - W[i]] + v[i];
std::cout << f[M];
return 0;
} 简述题目 有 n 个物品和一个容量为 W 的背包,每个物品有重量 wi 和价值 vi 两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。 思路 以下是错误思路(是部分背包问题的解法) 其实这道题我一开始想成贪心问题了,可能是因为小米的超高 性价比 手机感染了我 (雷军:??关我什么事~ 我先计算出了每个物品的 重量价值比(性价比),然后优先向背包内存放性价比高的物品, 然而后来我才意识到,因为会产生很多情况,比如: 设背包最多可容纳 50kg 的重量 物品 重量(kg) 价值 性价比 A 10 60 6 B 20 100 5 C 30 10 4 按照贪心,单位重量的价值排序:A >...