《趣学算法》——2.贪心算法2-1

26 篇文章 1 订阅
9 篇文章 0 订阅

首先我们来看一道题:

    某天,海盗劫掠了一艘装有各种各样古董的船,但海盗船最大载重量为C,每件古董的重量为wi,海盗该如何尽可能数量多的把古董装上船?

输入

请输入载重量c以及古董的个数n:

30 8

请输入每个古董的重量,空格分开:

4 10 7 11 3 5 14 2

输出

能装入的古董最大数量为Ans=5


思路:船的容量固定,优先把重量小的物品放进去,在容量固定的情况下。装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。 1)当载重量为定值c时,wi越小时,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止。2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选择出前i个古董,直到不能继续装为止,此时达到最优解。

解题步骤:

1)数据结构的定义。根据算法设计描述,我们用一维数组存储古董的重量double w[N];//一维数组存储古董的重量。

2)按重量排序,利用c++中的sort对古董的进行从小到大(非递减)排序。要使用得引用 #include <algorithm>头文件。

                            sort(w,w+n)

3 ) 按照贪心策略找最优解

            首先用变量ans记录以及装载的古董个数,tmp代表装载到船上的古董的重量,按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量c,则ans++,否则退出。

#include <iostream>
#include <algorithm>
const int N = 100005;
using namespace std;
double w[N];//古董的重量数组
int main()
{
	double c;
	int n;
	cout<<"请输入载重量c以及古董的个数n: "<<endl;
	cin>>c>>n;
	cout<<"请输入每个古董的重量,用空格分开:"<<endl;
	for(int i = 0;i<n;i++){
		cin >> w[i];//输入每个物品的重量
	}
	sort(w,w+n);//按古董升序排序
	double tmp = 0.0;
	int ans = 0;//tmp为已装载到船上的古董重量,ans为已装载的古董个数;
	for(int i = 0; i<n;i++){
		tmp+=w[i];
		if(tmp<=c)
			ans ++;
			else
			break;
	}
	cout<<"能载入的古董最大数量为Ans=";
	cout<<ans<<endl;
	return 0;
}
       输出结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值