贪心法——乘船问题

题目大致是:

有n个人,第i个人的重量为w[i],每艘船的最大载重量均为c,且最多只能乘两个人。用最少的船装载所有人。

解:

首先从最轻的人开始考虑,那么他应该和最重的人去坐,如果每个人都不能和它坐船,那么唯一的方法就是每个人做一艘船。

否则,他应该选择能够和他一起坐船的人中最重的那个,这样子才不会浪费。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;

struct node{
	int w;
}a[1001];
bool cmp(node a,node b){
	return a.w<b.w;
}
int main(){
	int i,j,n,c;
	int book[1001]={0};
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i].w);
	sort(a+1,a+1+n,cmp);
	int num=0;
	for(i=1;i<=n;i++){
		//book[i]=1;
		for(j=n;j>=1;j--){
			//one:如果它们两个的重量和小于等于c的话,并且j这个人没有被其他人给拉去,那么这是一种;
			if(a[i].w+a[j].w<=c && book[j]==0){
				num++; book[i]=1; book[j]=1; break;
			}
			//two:如果它们两个的重量和大于c的话且j这个人没有被拉去,那么j那个人只能自己和自己一个人坐一条船了;
			else if(a[i].w+a[j].w>c && book[j]==0){
				num++; book[j]=1;
			}
		}
		//如果上面的都循环完了,但是i还是没有满足的条件,那么说明它也只能自己坐一条船了;
		if(!book[i])  {num++; book[i]=1;}
	}
	printf("%d\n",num);
}
时间: 2024-11-05 06:21:35

贪心法——乘船问题的相关文章

贪心法基础题目 HDU

HDU2037: 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037 题解: 贪心算法:在对问题求解时,总是作出在当前看来是最好的选择.也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明).若要用贪心算法求解某问题的整体最优解,必须首先证明贪心思想在该问题的应用结果就是最优解!! 本题是贪心法的一个最简单的例子,将结束时间按从小到大排好序,然后寻找下一个开始时间大于等于上一个结束时间的,如此往复,即可解

HDU 1661 Assigments 贪心法题解

Problem Description In a factory, there are N workers to finish two types of tasks (A and B). Each type has N tasks. Each task of type A needs xi time to finish, and each task of type B needs yj time to finish, now, you, as the boss of the factory, n

【算法学习笔记】25.贪心法 均分纸牌问题的分析

贪心法: 贪?算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是贪?心策略的选择,选择的贪?策略必须具备?后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 太概念化了.总结起来三点: 可行性:必须满足问题的约束 局部最优:当前步骤中所有可行的选择里最佳的局部选择. 不可取消:选择一旦做出,后面的步骤就无法改变. 问题要具有贪心选择性

贪心法求解背包问题

#include<stdio.h> struct A{ double w; double v; double xingjiabi; }a[100],p; void QuickSort(A a[],int numsize) { int i=0,j=numsize-1; A p=a[0]; if(numsize>1) { while(i<j) { for(;j>i;j--) if(a[j].xingjiabi<p.xingjiabi) { a[i]=a[j]; break;

POJ-1042 Gone Fishing (贪心法求最佳钓鱼方案

Gone Fishing Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 28075   Accepted: 8371 Description John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachab

删数问题(贪心法经典问题)

问题描述:用键盘输入一个高精度的正整数N,去掉其中S个数字后剩下的数字按原左右次序排列组成一个新的正整数. 编程给定的N和S,寻找一个方案使得剩下的数字哦组成的新数最小. 思路解析: 使用逼近目标的贪心法来逐一逼近删除其中s个数符,每一步总数选择一个是剩下的数最小的数符删除.这样的贪心选择因为删除S个数符的全优解包含了删除一个 数符的子问题的最优解.按从左到右寻找递减区间,删除第一个数字.若找不到递减区间 则删除末尾的数字. 1 void find_Min_Integer(vector<int>

算法分析与设计——贪心法实验报告

   算法导论  课程设计 成 绩 题    目:    贪心法 学院班级:        1613013         学    号:      16130130216       姓    名:        库 妍           主讲教师:        张立勇          日    期:       2019.5.9         一.Knapsack Problem 1.实验题目 下面有5个具有值和权重列表的项目,背包最多可以包含100磅.解决了分数背包和0/1背包问题

贪心法——活动选择问题和背包问题

今天上午听了米老师讲的算法,感觉收获很多,对于算法更加有信心了.首先,先来宏观看一下: 这三种算法总的来说,刚开始看的时候不知道怎么下手,但是看多了也会有那么一点儿感觉.分治法是这三种算法里面都有的思想,动态规划和贪心都是将问题分解成子问题求解,但动态规划里面的子问题都带有联系,而贪心算法里面的子问题都相对独立,唯一不同的是,贪心算法要首先想出一个解决方案来构造求解最优解的过程. 宏观介绍下算法后,来看看贪心算法的两个实例. 一,活动选择问题 解决方案: 对于活动的选择问题,我们求解过程是这样的

贪心法求树的最小支配集,最小点覆盖,最大独立集

定义: 最小支配集:对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 V' 是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 V', 要么与 V' 中的顶点相邻. 在 V' 中除去任何元素后 V' 不再是支配集, 则支配集 V' 是极小支配集.称G 的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中的顶点个数称为支配数. 最小点覆盖:对于图G = (V, E) 来说,最小点覆盖