笔者最近因为蓝桥杯而不得不冲刺补算法的学习,特此将学习心得与大伙分享
背包问题可以说是dp(动态规划)的入门题目了,非常值得反复琢磨,个人而言其本质就是每一步都建立在上一步的最优解之上,从而达到全体最优解,例题及个人解法如下:
个人解法如下:
#include<iostream>
#define int long long //防止数据过大
#define endl '\n'//同关流作用
//#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int space[100000], value[10000];
void dp(int n, int v, int* s, int* w) {
int ans[1002][1002] = { 0 };
//cout << "价格的表格为:\n";
for (int i = 1; i <= n; i++) {//遍历每种情况
for (int j = 1; j <= v; j++) {
if (j < s[i])ans[i][j] = ans[i - 1][j];//如果当前物品大于当前背包容量,就取同列上一行
else {//否则比较同列上一行和当前物品加前面物品最优解的价值
ans[i][j] = max(ans[i - 1][j], ans[i - 1][j - s[i]] + w[i]);
}
//cout << ans[i][j] << '\t';
}//cout << endl;
}
cout << ans[n][v] << endl;
}
signed main() {//signed与int作用相同
ios::sync_with_stdio(0);//关流加快cin和cout的处理速度
cin.tie(0);
cout.tie(0);
int n, v;
cin >> n >> v;
for (int i = 1; i <= n; i++)
cin >> space[i] >> value[i];
dp(n, v, space, value);
return 0;
}