当前位置: 代码网 > it编程>编程语言>C/C++ > 算法分析与设计(贪心算法求背包问题)

算法分析与设计(贪心算法求背包问题)

2024年08月01日 C/C++ 我要评论
1.设有一个载重量为10的背包,现有4个可拆分物品,每个物品的重量分别为(w1,w2,w3,w4)=(2,4,5,6),它们的价值分别为(p1,p2,p3,p4)=(2,3,5,8)。试问:如何装载才能使得装入背包中的物品的总价值最大?(2)最大收益是选择第四件,第一件整个物品以及两个重量单位的第三件物品,总价值为12.(1)请设计并实现一个求解该问题的贪心算法,指出所采用的贪心选择策略。(2)求出最大收益,以及具体的装载方案。

问题描述:
1.设有一个载重量为10的背包,现有4个可拆分物品,每个物品的重量分别为(w1,w2,w3,w4)=(2,4,5,6),它们的价值分别为(p1,p2,p3,p4)=(2,3,5,8)。试问:如何装载才能使得装入背包中的物品的总价值最大?
(1)请设计并实现一个求解该问题的贪心算法,指出所采用的贪心选择策略。
(2)求出最大收益,以及具体的装载方案。
贪心选择策略:优先依次选择性价比最高,即单位 价值/重量 的值最大的物品,若物品不能整个放下就进行相应的分割,以此装载的获得的物品总价值最大;


参考代码如下:

#include<iostream>
using namespace std;
int n = 4, m= 10;
int w[] ={2,4,5,6};
int p[]= {2,3,5,8};
struct hh{
	int wei, value;
	double performance;
	bool operator<(const hh& x)const{
		return performance >x.performance;
		}
}a[10];

int main(){
	for(int i = 0;i<n; ++i){
		a[i].wei =w[i];
		a[i].value = p[i];
		a[i].performance =1.0*p[i]/w[i];
	}
	sort(a,a+n);
	for(int i=0;i<n;++i){
		printf("w.%d value:%d performance:%.21f\n",a[i].value,a[i].performance);
	}
	dobule val = 0;
	for(int i= ;i<n;++i){
		// 如果能放下整个物品
		if(a[i].wei<= m){
			m -=a[i].wei;
			val +=a[i].value;
		}
		else //分割物品
		{
			val +=a[i].performance *m;
			m -=m;
			break; // 省去后面无用的循环
		}
}
printf("最大总价值 = %。21f\n", val);
return 0;

(2)最大收益是选择第四件,第一件整个物品以及两个重量单位的第三件物品,总价值为12.

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com