贪心入门引例(一)--------简单最优装载问题

                                      🎁 简单最优装载问题

🎊问题描述

1. 我们有n个物体(每个物体重量不等)

2. 我们有一个包, 里面只能放重量总和为c的物品。

    请问怎么放能使 物品最多 ?


🎊解题思路

                           “ 这个很容易想到我们挑的东西越小,最后包里的物品数就越多

所以我们:

                             首先使用一个“ 结构体数组a[N] ” 记录下这些物体分别对应的序号index重量w,

                             然后按照 重量w 从小到大排序( 注意序号不能打乱)

                             最后,按照排好序的数组。一个一个放进包里直到放不下为止。

🎊程序代码

		//最优装载
#include<iostream>	
#include<algorithm>
#define N 100
using namespace std;
struct Node{
	int index;//第index件物品 
	int w;//物品的重量 
}; 
bool cmp(const Node &a,const Node &b){
	return a.w<b.w;
}
int main(){
	Node a[N];
	int n,c;
	cin>>n; //输入初始可选物品总数 
	cin>>c;//输入背包的容量 
	for(int i=0;i<n;i++){
		cin>>a[i].w;
		a[i].index=i+1;
	} 
		sort(a,a+n,cmp); //将所有物品按重量递增排序 
	int sum=0; //sum用于统计背包里的物品总数。 
	for(int i=0;i<n;i++){
		   if(c-a[i].w>=0){  //判断背包是否还装的下当前物品 
		   	cout<<"选择重为"<<a[i].w<<"的第"<<a[i].index<<"号物品"<<endl;
		   	c-=a[i].w;  //将物品放入背包里后背包容量减少。 
		   	sum++;
		   }
		   else{
		    break;
		   }
	}
	cout<<"包里有"<<sum<<"件物品"<<endl; 
	return 0;
} 

🎊实例测试+运行结果

🎊正经致谢

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值