| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1445 人关注过本帖
标题:求助:背包问题,用贪心算法
只看楼主 加入收藏
oosong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求助:背包问题,用贪心算法
题目:载重量为M的背包,重量为wi,价值为pi的物体,1<=i<=n,白物体装满背包,使背包内的物体价值最大,物体可以分割。
#include<iostream.h>
typedef struct
{
float p;
float w;
float v;
}OBJECT;
void merge(OBJECT instance[],int p,int q,int r ,int m)
{
OBJECT *bp=new OBJECT[m];
int i,j,k;
i=p;
j=q+1;
k=0;
while(i<=q && j<=r)
{
  if(instance.v>=instance[j].v)
    bp[k++]=instance[i++];
  else
   bp[k++]=instance[j++];
}
if(i==q+1)
{
  for(;j<=r;j++)
   
   bp[k++]=instance[j];
}
else
{
  for(;i<=q;i++)
   bp[k++]=instance;
}
k=0;
for(i=p;i<=r;i++)

   instance=bp[k++];
delete bp;
}
void merge_sort(OBJECT instance[],int n)
{
int s,t,i=1;
while(t<n)
{
  s=t;
  t=2*s;
  i=0;
  while(i+t<n)
  {
   
   merge(instance,i,i+s-1,i+t-1,t);
   i=i+t;
  }
  if(i+s<n)
   merge(instance,i,i+s-1,n-1,n-i);
   
}
}

float knapsack_greedy(float M,OBJECT instance[],float x[],int n)
{
int i;
float m,p=0;
for(i=0;i<n;i++)
{
  instance.v=instance.p/instance.w;
  x=0;
}
merge_sort(instance,n);

m=M;
for(i=0;i<n;i++)
{
  if(instance.w<=m)
  {
   x=1;
   m-=instance.w;
   p+=instance.p;
  }
  else
  {
   x=m/instance.w;
   p+=x*instance.p;
   break;
  }
}
return p;
}
int main()
{
int i,n;
float m,p;
cout<<"输入物体个数:";
cin>>n;
cout<<"输入背包载重量:";
cin>>m;
OBJECT *instance=new OBJECT[n];
float *x=new float[n];
for(i=0;i<n;i++)
{
  cout<<"输入物品价值:";
  cin>>instance.p;
  cout<<"输入物品重量:";
  cin>>instance.w;
}
p=knapsack_greedy(m,instance,x,n);
for(i=0;i<n;i++)
  cout<<"第"<<i<<"件物品要放:"<<x<<endl;
cout<<endl<<"得到背包的总价值:"<<p<<endl;
return 0;
}
这是我写的,不知道为什么调用合并排序,结果就是不对。。求助高手啊!!!
搜索更多相关主题的帖子: 贪心 算法 背包 
2010-04-14 00:28
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:7 
为什么代码这么复杂啊,你这种背包问题只要按价值排序,然后从价值最大的开始往里面放 放到背包满了,输出最大值就OK了;
2010-04-14 00:43
oosong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-14
收藏
得分:0 
复杂的是排序,因为要使时间复杂度最低
2010-04-14 23:44
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 3楼 oosong
排序你可以用2个FOR循环来搞定,不过这效率不怎么高,还有就是用快排,但不知道你会不
2010-04-15 22:08
asdjc
Rank: 6Rank: 6
来 自:武汉
等 级:侠之大者
威 望:7
帖 子:98
专家分:487
注 册:2010-1-22
收藏
得分:7 
好像不用这么复杂,求出每个物品的单位重量价值即pi/wi,在以此为权排序。由大到小装包直到满为止。
2010-04-17 12:56
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
那就用背包做了
2010-04-17 20:08
oosong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-4-14
收藏
得分:0 
我是想问为什么调用合并排序会错,题目要求时间复杂度最低
2010-04-17 22:39
快速回复:求助:背包问题,用贪心算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014301 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved