2.3阿里巴巴与四十大盗 背包问题

有一天,阿里巴巴赶着一头毛驴上山砍柴。砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空飞扬,朝他这儿卷过来,而且越来越近。靠近以后,他才看清原来是一支马队,他们共有四十人,一个个年轻力壮、行动敏捷。一个首领模样的人背负沉重的鞍袋,从丛林中一直来到那个大石头跟前,喃喃地说道:“芝麻,开门吧!”随着那个头目的喊声,大石头前突然出现一道宽阔的门路,于是强盗们鱼贯而入。阿里巴巴待在树上观察他们,直到他们走得无影无踪之后,才从树上下来。他大声喊道:“芝麻,开门吧!”他的喊声刚落,洞门立刻打开了。他小心翼翼地走了进去,一下子惊呆了,洞中堆满了财物,还有多得无法计数的金银珠宝,有的散堆在地上,有的盛在皮袋中。突然看见这么多的金银财富,阿里巴巴深信这肯定是一个强盗们数代经营、掠夺所积累起来的宝窟。为了让乡亲们开开眼界,见识一下这些宝物,他想一种宝物只拿一个,如果太重就用锤子凿开,但毛驴的运载能力是有限的,怎么才能用驴子运走最大价值的财宝分给穷人呢?阿里巴巴陷入沉思中……

注:可以财宝可以打破带走

解题思路:

先算出性价比,然后对性价比进行排序,可巧妙的利用结构体的知识进行解题。

解题代码:

#include <stdio.h>
typedef struct three{
	double w;
	double v;
	double p;
}three;
int main(){
	three t;
	int x=0;double sum=0;
	int MAX=30;
	three arr[10];
	arr[0].w=2;arr[1].w=5;arr[2].w=8;arr[3].w=9;arr[4].w=5;
	arr[5].w=4;arr[6].w=5;arr[7].w=5;arr[8].w=5;arr[9].w=4;
	arr[0].v=8;arr[1].v=15;arr[2].v=20;arr[3].v=18;arr[4].v=8;
	arr[5].v=6;arr[6].v=7;arr[7].v=6;arr[8].v=5;arr[9].v=3;
	for(int i=0;i<10;i++){
		arr[i].p=arr[i].v/arr[i].w;
	}
	for(int i=0;i<10;i++){
		for(int j=i;j<10;j++){
			if(arr[i].p<arr[j].p){
				t=arr[i];
				arr[i]=arr[j];
				arr[j]=t;
			}
		}
	}
	while(MAX>0){
		sum=sum+arr[x].v;
		MAX=MAX-arr[x].w;
		x++;
	}
	MAX=MAX+arr[x-1].w;
	sum=sum-arr[x-1].v;
	printf("%.2lf",MAX*arr[x-1].p+sum);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ychhh/article/details/84145034