1.概述
部分背包问题与0-1背包问题的根本区别在于部分背包问题在选择物品时可以选择物品的其中一部分(比如黄金,钻石等选择的时候可以对其进行切割).
2.算法思想
贪心法的基本思路:
——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
实现该算法的过程:
Begin 从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解
3.代码实现
#include<iostream>
using namespace std;
struct Node {
int weight;
int value;
};
int main() {
int n = 0, m = 0;
while (cin >> n >> m) {
int maxValue = 0;
int residualCapacity = m;
Node* node = new Node[n];
for (int i = 0; i < n; ++i) {
cin >> node[i].weight;
cin >> node[i].value;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (node[i].value / node[i].weight
< node[j].value / node[j].weight) {
swap(node[i], node[j]);
}
}
if (residualCapacity >= node[i].weight) {
residualCapacity = residualCapacity - node[i].weight;
maxValue = maxValue + node[i].value;
} else if (residualCapacity > 0) {
maxValue = maxValue
+ node[i].value / node[i].weight * residualCapacity;
break;
} else {
break;
}
}
cout << maxValue << endl;
delete[] node;
}
return 0;
}