https://www.bilibili.com/video/BV1jt411m7Rc 讲得很好!看这个
https://www.bilibili.com/video/BV1X741127ZM 当做补充。其实不用看。。
以"集合"角度 来分析DP问题:有限集合中,最优值。
01背包问题
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8
分析&代码
https://www.bilibili.com/video/BV1jt411m7Rc 讲得很好!看这个
----------------
#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 - 1][j - w[i]] + v[i];
int value2 = f[i - 1][j];
//printf("对于第%d个物品,若装下,%d, 若不装, %d,当前能装的capacity:%d \n",i,value1,value2,j);
f[i][j] = max(value1, value2);
}
}
}
// show();
cout << f[num][capacity] << endl;
}