题目:有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品 A B C D E F G
重量 35 30 60 50 40 10 25
价值 10 40 30 50 35 40 30
思想:装性价比最高的物品。
#include <iostream> #include <vector> #include <tuple> #include <algorithm> using namespace std; bool compare(tuple<int, int, double> t1, tuple<int, int, double> t2) { return get<2>(t1) > get<2>(t2); } int main() { int n = 0, W = 0, w = 0, v = 0; cin >> n >> W;//总数量和最大重量 vector<tuple<int, int, double> > vec(n); vector<tuple<int, int>> vt; for (int i = 0; i < n; ++i) { cin >> w >> v;//重量和价值 vec[i] = { w, v , (double)v / (double)w }; } sort(vec.begin(), vec.end(), compare);//权值排序 cout << endl; double sum = 0.0; for (auto& i : vec) { if (W - get<0>(i) >= 0) {//先整块选择 W = W - get<0>(i); sum += get<1>(i); cout << "重量:" << get<0>(i) << " 价值:" << get<1>(i) << "放了1个" << endl; } else if(W - get<0>(i) < 0 && W > 0){ //划分选择 double k = (double)W / (double)get<0>(i); sum += get<1>(i) * k; cout << "重量:" << get<0>(i) << " 价值:" << get<1>(i) << "放置比例:" << k << endl; break; } } cout << endl; cout << "总价值:" << sum << endl; system("PAUSE"); return 0; }