洛谷P2240 【深基12.例1】部分背包问题 题解

非常简单的一道贪心题,本苟蒻也是很轻易地一遍过(因为忽略了数据精度,所以第一遍0分,哈哈哈)

没有什么多余的操作,开一个结构体数组,将单价最高的排在前面,然后遍历判断即可。

下面是AC代码:

#include<bits/stdc++.h>  //万能头
using namespace std;

int main(void)
{  
   struct node //定义一个结构体数组
   {
   	double sl;
   	double zj;
   	double dj;
   }; 
   struct node q[101];
   double n,backpack,sum=0;
   cin>>n>>backpack;
   for(int i=0;i<n;i++){
   	cin>>q[i].sl>>q[i].zj;
   	q[i].dj=q[i].zj/q[i].sl;
   }
   for(int i=0;i<n;i++){    //冒泡排序
   	for(int j=i+1;j<n;j++){
   		if(q[j].dj>q[i].dj){
   			struct Q temp;
   			temp=q[i];
   			q[i]=q[j];
   			q[j]=temp;
		   }
	   }
   }
   for(int i=0;i<n;i++){
   	if(backpack-q[i].sl>-0.000001){sum+=q[i].zj;backpack-=q[i].sl;}  //double型不能直接相等
   	else {sum+=(backpack*q[i].dj);break;}
   }
   printf("%.2f",sum);
   return 0;	
} 

啊哈哈哈哈,升级版来咯。

用冒泡排序的时候心里一直不痛快,就琢磨着能不能用sort对结构体数组排个序,然后现学现用,写了一个用sort排序的版本,别问,问就是我是个追求完美的男人。

#include<bits/stdc++.h>
using namespace std;

struct node
   {
   	double  sl;
   	double  zj;
   	double  dj;
   }q[101]; 
bool comparison(node a,node b) //自定义sort的比较方法。
{
	return a.dj>b.dj;
}
int main(void)
{  

   int n;  如果将n定义成double,在sort函数中将会报错。
   double backpack,sum=0;
   cin>>n>>backpack;
   for(int i=0;i<n;i++){
   	cin>>q[i].sl>>q[i].zj;
   	q[i].dj=q[i].zj/q[i].sl;
   }
   sort(q,q+n,comparison);  //好美好快好简洁
   for(int i=0;i<n;i++){
   	if(backpack-q[i].sl>-0.000001){sum+=q[i].zj;backpack-=q[i].sl;}
   	else {sum+=(backpack*q[i].dj);break;}
   }
   printf("%.2f",sum);
   return 0;	
} 

日常打个卡,大家晚安。

猜你喜欢

转载自blog.csdn.net/qq_62440805/article/details/122815520
今日推荐