贪婪法解背包问题

来源:互联网 发布:流星网络电视apk安卓 编辑:程序博客网 时间:2024/06/06 18:13

背包问题分好多种!以下代码用于解决,背包必须装满,物品可以分割的情况。期望背包中物品价值最大。

#include<iostream>using namespace std;/*---------贪婪法解决背包问题-------总是对当前的问题做最好的选择,从局部最优到全局最优。先按物品效益、重量比值升序排序。然后每次选择比重大的物品装载,知道装满背包为止!*/struct goodinfo{float p; //物品效益float w; //物品重量float X; //物品该放的数量int flag;//物品编号};//按物品效益,重量比值做升序排列//插入排序void InsertSort(goodinfo goods[],int n){int i,j;for(j = 2;j<=n;j++){goods[0] = goods[j];i = j-1;while(goods[0].p>goods[i].p){goods[i+1] = goods[i];i--;}goods[i+1] = goods[0];}}void GreedyMethod(goodinfo goods[],float M,int n){int i,j;for(i = 1;i<=n;i++){goods[i].X = 0;}for(i = 1;i<n;i++){if(goods[i].w>M)break;goods[i].X = 1;M = M - goods[i].w;}if(i<=n)goods[i].X = M/goods[i].w;//按物品编号做降序排列for(j = 2; j<=n;j++){goods[0] = goods[j];i = j - 1;while(goods[0].flag<goods[i].flag){goods[i+1] = goods[i];i--;}goods[i+1] = goods[0];}cout<<"最优解为:"<<endl;for(i = 1;i<=n;i++){cout<<"第"<<i<<"件物品要放: ";cout<<goods[i].X<<endl;}}int main(){int i,n;float M;goodinfo *goods;cout<<"Please input the amount of goods and the bag's weight:"<<endl;cin>>n>>M;goods = new struct goodinfo[n+1];for(i = 1;i<=n;i++){goods[i].flag = i;cout<<"Please input weight and balance : "<<endl;cin>>goods[i].w>>goods[i].p;goods[i].p = goods[i].p/goods[i].w;//物品的效益,重量比}InsertSort(goods,n);GreedyMethod(goods,M,n);return 0;}


原创粉丝点击