//大家看注释就可以 了谢谢大家 差不多用的是排序
问题描述
有一個背包,容量為M。有N種物品,每種物品有其體積Wi與價值Vi。將這些物品的一部分放入背包,每種物品可以放任意多個,要求總體積不超過容量,且總價值最大。
输入格式
第一行為N, M。
之後N行,每行為Wi, Vi。输出格式
一個數,為最大價值。
样例输入
3 20
15 16
6 6
7 5样例输出
18
数据规模和约定
N, M<=1000。
#include <iostream>
using namespace std;
//完全背包问题
const int N = 1010; //[i][j]存储物品发到的背包
int v[N], w[N], f[N]; //所以这边定3个 一个是容量 一个物品 一个是背包
int n, m;
int main()
{
scanf("%d%d", &n, &m); //输入一个返回 则退出循环
for (int i = 1;i <= n;i++) {
scanf("%d%d", &v[i], &w[i]);
}
for (int i = 1;i <= n;i++)
for (int j = v[i];j <= m;j++) {
f[j] = max(f[j], f[j - v[i]] + w[i]); //递增得出最大 18
}
printf("%d", f[m]); //容量為M所以是f[m]
return 0; //大一新生 自学c++ 所以注释这方面什么的可能不怎么好 谢谢大家理解
}