|
|
回复 #7 newkid 的帖子
真的很强大。。。还有一个经典算法,那就是贪心算法,贪心算法可以实现背包问题的最优解,但不能求出0/1背包问题的最优解,不知该如何求解用贪心算法实现背包问题:
背包问题:与0/1背包问题类似,所不同的是在选择物品 i 装入背包时,可以选择物品 i 的一部分,而不一定要全部装入背包。
实例:物品id=(1,2,3) 价值Vi=(60,100,120) 重量Wi=(10,20,30) 背包容量C=50 那么最优解的答案应该是取ID1+ID2+2/3 ID3=60+100+80=240
C语言算法实现如下:
- #include <stdio.h>
- #include <iostream.h>
- #define MAXWEIGHT 50
- #define n 3
- float pw[n]={0},x[n]={0};
- int w[n]={0},p[n]={0};
- void sort(int p[],int w[])
- {
- int temp1,temp2;
- float temp;
- int i,j;
- for(i=0;i<n;i++)
- {
- pw[i]=float(p[i])/w[i];
- }
- for(i=0;i<n-1;i++)
- {
- for(j=i+1;j<n;j++)
- {
- if(pw[i]<pw[j])
- {
- temp=pw[i],pw[i]=pw[j],pw[j]=temp;
- temp1=p[i],temp2=w[i];
- p[i]=p[j],w[i]=w[j];
- p[j]=temp1,w[j]=temp2;
- }
- }
- }
- }
- void GreedyKnapsack(int p[],int w[])
- {
- int m=MAXWEIGHT,i;
- for(i=0;i<n;i++) x[i]=0.0;
- for(i=0;i<n;i++)
- {
- if(w[i]>m) break;
- x[i]=1.0;
- m=m-w[i];
- }
- if(i<n) x[i]=float(m)/w[i];
- }
- void main()
- {
- int i;
- printf("请输入每个物体的效益和重量:\n");
- for(i=0;i<n;i++)
- {
- cin>>p[i]>>w[i];
- }
- for(i=0;i<n;i++)
- {
- printf("原物体%d的效益和重量分别为%d,%d:\n",i+1,p[i],w[i]);
- }
- sort(p,w);
- printf("\n\n\n按效益值非递增顺序排列物体:\n");
- for(i=0;i<n;i++)
- {
- printf("物体%d的效益和重量分别为%d,%d 效益值为:%f\n",(i+1),p[i],w[i],pw[i]);
-
- }
- GreedyKnapsack(p,w);
- printf("\n\n\n最优解为:\n");
- for(i=0;i<n;i++)
- {
- printf("第%d个物体要放%f:\n",i+1,x[i]);
- }
- }
复制代码
[ 本帖最后由 〇〇 于 2010-4-16 15:46 编辑 ] |
|