实验二:贪心算法
- 今天晚上开始做贪心算法的实验,大一暑假时候接触过,其基本思想就是不考虑总体最优,而是从局部最优的角度出发去解题。
- 现在开始去做题啦
- 问题是给出背包总容量,再分别给出物品的重量和价值,其中物品可以分割为任意大小,要求尽可能装入背包的物品总价值最大。求出总价值。
- **求解思路:
- 输入:第一行输入背包容量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!!!先做实验三