任务:背包问题的求解
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包最大承载重量为C。假设物品是可分割的,应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
定义N个物品的基本数据和背包容量C,编程输出C能装下的最大价值和所选择物品的编号。
#include <iostream> #include <algorithm> using namespace std; struct Goods { int weight; int value; float P; float N; }; bool compare (Goods &a,Goods &b) { return a.P>b.P; } void Greedy(Goods goods[],int n, int c) { for(int i=0; i<n; i++) { if(c>goods[i].weight) { c-=goods[i].weight; goods[i].N=1; } else if(c>0){ goods[i].N=c/(goods[i].weight*1.0); c=0; } } } int main() { int n; int v; float total_value=0; float total_weight=0; cout<<"请输入背包的容量:"<<endl; cin>>v; cout<<"请输入物品的数量:"<<endl; cin>>n; Goods goods[n]; cout<<"请分别输入物品的重量和价值:"<<endl; for(int i=0; i<n; i++) { cin>>goods[i].weight>>goods[i].value; goods[i].N=0; } sort (goods,goods+n,compare); //InsertSort(goods,n); Greedy(goods,n,v); for(int i=0;i<n;i++) { if(goods[i].N==0.0)break; total_value+=(goods[i].value*goods[i].N); total_weight+=(goods[i].weight*goods[i].N); cout<<"重量为: "<<goods[i].weight<<" "<<"价值为: "<<goods[i].value<<" 的装入的比例为: "<<goods[i].N<<endl; } cout<<"背包的容量为: "<<v<<endl;//输出背包容量 cout<<"装入背包中的物品的总重量为: "<<total_weight<<endl; cout<<"装入背包中的物品的总价值为: "<<total_value<<endl; return 0; } |
代码有部分参考,仅为学习交流使用