程序设计:八戒在山洞里迷路了,他不小心走到了一个山洞里,结果发现,山洞里有许多珠宝和宝石,还有很多昂贵的首饰,八戒开心极了,他先把这些东西全部带回家,可是他的背包容量有限,只能装下m千克及以内的东西,现在要你帮助八戒判断怎样装才能带回在m千克以内,价值最高的一些物品
样例输入:
8 3
2 3
5 4
5 5
样例输出:
8
解析:
一、打框架
#include <bits/stdc++.h>
using namespace std;
int main() {
return 0;
}
二、定义w, c数组分别存储重量与价值f数组存储对应的总价值
int w[1001], c[1001], f[1001];
三、循环输入宝石重量与对应的价值
for(i = 1; i <= n; i++){
cin >> w[i] >> c[i];
}
四、循环判断如果背包的容量够的话,放这块宝物和不放这块宝物的价值那个更大
for(i = 1; i <= n; i++){
for(j = m; j >= 0; j--){
if(j >= w[i]){
f[j] = max(f[j], f[j - w[i]] + c[i]);
}
}
}
五、输出最终最优解
cout << f[m] << endl;
完整代码:
#include <bits/stdc++.h>
using namespace std;
//w, c数组分别存储重量与价值f数组存储对应的总价值
int w[1001], c[1001], f[1001];
int main() {
//1 m表示背包总容量,n表示宝石总数
int i, j, m, n;
cin >> m >> n;
//2循环输入宝石重量与对应的价值
for(i = 1; i <= n; i++){
cin >> w[i] >> c[i];
}
//3 动态求解每一个小问题:宝石个数为i 背包大小为j
//设f[j]表示前i块宝石,背包容量为j时的最优价值
for(i = 1; i <= n; i++){
for(j = m; j >= 0; j--){//for(j = m; j >= w[i]; j--) 常数优化,下方的if条件可省略
if(j >= w[i]){
f[j] = max(f[j], f[j - w[i]] + c[i]);
}
}
}//输出最终最优解
cout << f[m] << endl;
return 0;
}