这个问题 是属于事先推出数学公式,然后计算机只是实现而已,还是依靠人脑嘛!
https://www.bilibili.com/video/BV1X741127ZM 57min
有N种物品和 一个能装capacity重量的背包,每种物品都有无限件可用。
第i种物品价值是v[i],重量是w[i]。
求解 能装入,且价值总和最大。
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <stdio.h>
using namespace std;
int capacity;
int num;
int w[1001] = {0}; // weight
int v[1001] = {0}; // value
int f[1001][1001] = {0}; // 结果
void show() {
for (int i = 0; i <= num ;i ++){
printf("%d: weight:%d value:%d \n",i,w[i],v[i]);
}
for (int i = 0; i <= num; i++){
for (int j = 0; j <= capacity ; j++){
cout << f[i][j] << " ";
}
cout << endl;
}
}
int main() {
cin >> num >> capacity;
for (int i = 1; i <= num ; i++) {
cin >> w[i] >> v[i];
}
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= capacity ; j++) {
if (w[i] > j) {
// printf("第%d个物品 装不下,当前能装的capacity:%d \n",i,j);
f[i][j] = f[i - 1][j];
} else {
int value1 = f[i][j - w[i]] + v[i]; //与01背包相比, 不是 i-1了
int value2 = f[i-1][j];
f[i][j] = max(value1, value2);
}
}
}
// show();
cout << f[num][capacity] << endl;
}