求0/1背包问题(贪心法)

lezi1022 2003-12-27 04:07:57
k=20
对{1,2,…,n}中元素个数≤k的子集T求价值和 ∑i∈TPi与重量和∑i∈T Wi
在这一步我写不下去了,
谁能帮帮忙,写一个求出所有的子集,并求出每个子集的价值和与重量和!
或者写个完整程序给我!
是用贪心法,按照性价比非递增排列!
...全文
102 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
loewe 2003-12-28
  • 打赏
  • 举报
回复
#include<iostream.h>
#define N 5
int w[N],p[N],save[N],cop[N],Max; //w[i]表示第i个物品的重量,p[i]是其价值
void Search(int i,int weight,int R) //weight 表示剩余可放重量,R表示当前已经转载的重量
{
if(i==N || weight==0)
{
if(R>Max)
{
Max=R; //最大
for(int k=0;k<N;k++)
save[k]=cop[k]; //记录哪些物品被放入背包,1表示放入
}
return ;
}
else
{
if(w[i]<weight)
{
cop[i]=1;
Search(i+1,weight-w[i],R+p[i]);
cop[i]=0;
Search(i+1,weight,R);
}
else
Search(i+1,weight,R);
}
}
void main()
{
int i,weight;
cout<<"Weight = ";
cin>>weight;
for(i=0;i<N;i++)
{
cop[i]=0;
cout<<"The "<<i<<" : "<<endl;
cin>>w[i]>>p[i];
}
Max=0;

Search(0,weight,0);
cout<<endl<<"Max = "<<Max<<endl; //结果

for(i=0;i<N;i++)
if(save[i]!=0)
cout<<i<<"\t";
}


用了以下数据测试:
weight = 40
w: 8 16 21 17 12
p: 8 14 16 11 7

结果是:
Max = 30
1 2
ycxw 2003-12-27
  • 打赏
  • 举报
回复
你知道算法的话,还不好写啊?

33,029

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧