实验二:贪心算法

实验二:贪心算法

  • 今天晚上开始做贪心算法的实验,大一暑假时候接触过,其基本思想就是不考虑总体最优,而是从局部最优的角度出发去解题。
  • 现在开始去做题啦
  • 问题是给出背包总容量,再分别给出物品的重量和价值,其中物品可以分割为任意大小,要求尽可能装入背包的物品总价值最大。求出总价值。
  • **求解思路:
  • 输入:第一行输入背包容量m 物品个数n,接下来n行输入n个背包的容量和总价值。
  • 求解::step1:把r[],j[]数组中的数做除得出这n个背包的单价放入a[]中,然后根据
  • 为什么自己的代码和老师的代码运行结果不一样???
  • **!!!**实验要求是可分解的背包问题,可是实验代码给的是0-1背包问题的代码,自己写的代码也是正确的。看来还是0-1背包问题更难一些。
  • 现在这里写一下可分解的0-1背包问题的思路吧,可能排序的地方,因为要根据单价由高到低排序此物体相连的容量和总价,所以用冒泡排序使时间复杂度高了。
  • step1:根据单价由高到低队此物体相连的容量和总价排序
  • step2:在while循环中,以当前背包的容量current>=0为限制条件进行循环,当在循环之内时,总效益直接加此物体的价值。当在不满足循环时,总效益加current*j[i]。当所有物体都放入背包依然没有装满时,break。
  • 代码如下:
在这里插入代码片
#include <stdio.h>//可分解的背包问题 
int main(){
    
    
	double r[1000],j[1000],a[1000];
	int n;
	double m,t,Q=0;
	scanf("%d%lf",&n,&m);
	for(int i=0;i<n;i++)
	scanf("%lf%lf",r+i,j+i);
	for(int i=0;i<n;i++)
	a[i]=j[i]/r[i];
	for(int i=0;i<n-1;i++){
    
    
		for(int k=0;k<n-i-1;k++){
    
    
			if(a[k]<a[k+1]){
    
    
				t=a[k];a[k]=a[k+1];a[k+1]=t;
				t=r[k];r[k]=r[k+1];r[k+1]=t;
				t=j[k];j[k]=j[k+1];j[k+1]=t;
			}
			//printf("%lf    %lf    %lf   \n",a[k],r[k],j[k]); 
		}
	}	
	double current=m;
//	for(int i=0;i<n;i++)
//	printf("%.2lf    %.2lf    %.2lf   \n",a[i],r[i],j[i]);

	int i=0,b=0;
	while(current-r[i]>=0){
    
    
		current=current-r[i];
		Q+=j[i];//printf("%.2lf\t",Q);
		if(i==n-1){
    
    
			b=1;
			break;
		}
		i++;
	}
	if(b==0)
	Q+=current*a[i];
	printf("%.2lf\n",Q);
}
/*测试样例 
7 150
35 10
30 40
60 30
50 50
40 35
10 40
25 30
结果为190.63
*/

  • ok!!!先做实验三

猜你喜欢

转载自blog.csdn.net/CSDN_Ysu/article/details/109033544