用贪心算法解背包问题(装载问题)
来源:互联网 发布:js span disabled 编辑:程序博客网 时间:2024/05/22 02:00
题目描述
给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知第 i 种食品的最多拥有Wi 公斤,其商品价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车中的所有物品总价值最大。
题目分析
分析:因为每一个物品都可以分割成单位体积,单位体积的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答。方法如下:
(1)先将单位块收益按从大到小进行排序;
(2)从前到后考虑所有物品:a.如果可以完全放入,当前价值加上物品总价值,剩余体积减去物品总体积;b.如果可以部分放进,当前价值加上物品价值*剩余体积,使剩余体积为0.
程序代码
#include<iostream>using namespace std;/** * @author zjq~ * @time 2017/07/11 * @func 贪心算法解决背包问题 */ void Knapsack(float* w,float* v,float* x,int n,float c){ //默认传过来的物品是按照单位质量的价值从大到小排序的 for(int i=0;i<n;i++){ if(w[i]<c){ x[i]=1; c-=w[i]; }else{ x[i]=c/w[i]; break; } }} int main(){ int n=3; //物品总数 float c=50; //背包容量 float w[]={10,20,30}; //第 i+1 件物品的重量 float v[]={60,100,120}; //第 i+1 件物品的价值 float x[]={0,0,0}; //第 i+1 件物品选择的数量 初始都为 0 Knapsack(w,v,x,n,c); float sum=0; for(int i=0;i<n;i++){ cout<<"第"<<i+1<<"件物品装入"<<x[i]<<"件"<<endl; sum+=v[i]*x[i]; } cout<<"最大价值为:"<<sum<<endl;}
最后
OJ地址:http://acm.hdu.edu.cn/showproblem.php?pid=2111
注意,这里在获取最优解的同时要记得按照单位体积的大小排序!
阅读全文
0 0
- 用贪心算法解背包问题(装载问题)
- 高效算法设计_贪心法(最优装载问题,部分背包问题,乘船问题)
- 贪心算法 最优装载问题
- 最优装载问题--贪心算法
- 背包问题(贪心算法)
- 背包问题(贪心算法)
- 贪心算法(背包问题)
- 0022算法笔记——【贪心算法】背包问题,最优装载问题
- 0022算法笔记——【贪心算法】背包问题,最优装载问题
- 0022算法笔记——【贪心算法】背包问题,最优装载问题
- 贪心算法 - 背包问题
- 贪心算法----背包问题
- 【贪心算法】:背包问题
- 贪心算法-背包问题
- 贪心算法 背包问题
- 贪心算法-背包问题
- 【贪心算法】背包问题
- 贪心算法-背包问题
- 54_RT
- 简易商品购物系统购物界面程序设计
- 阶段性测验遗漏知识点
- 堆-数据结构
- 第二次作业
- 用贪心算法解背包问题(装载问题)
- Markdown常用语法快速入门
- jzoj 1279_解题_dp
- poj2184DP或dfs
- 学习之旅5
- 【图像处理】VTK二维图像标记bug修正
- PHP 自己封装数据分页类
- maven 经常有些jar下不了的解决方法
- context画图