| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 771 人关注过本帖
标题:效率极高的0/1背包程序
只看楼主 加入收藏
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
收藏
 问题点数:0 回复次数:5 
效率极高的0/1背包程序
这个程序是我根据一个递归程序改造的. #define N 5 #define LIMIT 10 int w[20],p[20],max=0; struct{int top,a[20],sumw[20],lp[20],rp[20];}s; push(int x,int y,int z){ s.a[++s.top]=x;s.sumw[s.top]=y;s.lp[s.top]=z;} 入栈 pop(int *x,int *y,int *z){ *x=s.a[s.top];*y=s.sumw[s.top];*z=s.lp[s.top--];}  出栈 record(int *rd){int j; for(j=0;j<=s.top;j++)rd[j]=s.a[j];} f(int n,int sp,int *b,int l,int *k){int mp1,temp1,temp2,mp=0,sw=0,i=0,x=1; s.top=-1; while(s.top>-2){ if(w[i]+sw<=l&&x) if(i<n-1){push(i,sw,sp);sw+=w[i];i++;} else {max=sp;record(b);b[*k=s.top+1]=n-1; temp1=n-1;temp2=s.a[s.top]; while(temp1-temp2==1){temp1=temp2;temp2=s.a[--s.top];} \*此处为我的创意*pop(&i,&sw,&sp);x=0;} else if(sp-p[i]>max){sp-=p[i];x=1; if(i<n-1)i++; else {max=sp;record(b);*k=s.top;pop(&i,&sw,&sp);x=0;}} else {pop(&i,&sw,&sp);x=0;}}} main(){int i,j,sp=0,b[20],k; printf("enter the weight and price"); for(j=0;j<N;j++){scanf("%d",&w[j]);scanf("%d",&p[j]);sp+=p[j];} f(N,sp,b,LIMIT,&k); for(i=0;i<=k;i++)printf("%d",b[i]);printf("\n%d",max);}
搜索更多相关主题的帖子: 背包 效率 
2005-05-16 15:39
simpley
Rank: 1
等 级:新手上路
帖 子:262
专家分:0
注 册:2005-2-23
收藏
得分:0 
把代码进行了简化,效率一样:
 int w[20],p[20],max=0;
struct{int top,a[20],sumw[20],lp[20],rp[20];}s;
push(int x,int y,int z){
s.a[++s.top]=x;s.sumw[s.top]=y;s.lp[s.top]=z;}
pop(int *x,int *y,int *z){
*x=s.a[s.top];*y=s.sumw[s.top];*z=s.lp[s.top--];}
record(int *rd){int j;
for(j=0;j&lt;=s.top;j++)rd[j]=s.a[j];}
f(int n,int sp,int *b,int l,int *k){int mp1,temp1,temp2,mp=0,sw=0,i=0,x=1;
s.top=-1;
while(s.top&gt;-2){
if(i&lt;n-1){
  if(w[i]+sw&lt;=l&amp;&amp;x){
      push(i,sw,sp);sw+=w[i];i++;}
  else if(sp-p[i]&gt;max){sp-=p[i];x=1;i++;}
   else {pop(&amp;i,&amp;sw,&amp;sp);x=0;}}
else {record(b);
if(w[i]+sw&lt;=l&amp;&amp;x){b[*k=s.top+1]=n-1;max=sp;temp1=n-1;temp2=s.a[s.top];
while(temp1-temp2==1){temp1=temp2;temp2=s.a[--s.top];}}else{*k=s.top;max=sp-p[i];}
pop(&amp;i,&amp;sw,&amp;sp);x=0;}}}
main(){int i,j,sp=0,b[20],k;
for(i=0;i&lt;20;i++)b[i]=0;
for(j=0;j&lt;4;j++){scanf("%d",&amp;w[j]);scanf("%d",&amp;p[j]);sp+=p[j];}
f(4,sp,b,7,&amp;k);
for(i=0;i&lt;=k;i++)printf("%d",b[i]);printf("\n%d",max);}

myQQ::445750010
2005-05-17 00:09
zhtmark
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册:2005-3-25
收藏
得分:0 
这程序的功能是是什么?解释一下,谢了

zhtmark QQ:451361060
2005-05-20 11:22
tary
Rank: 1
等 级:新手上路
帖 子:780
专家分:0
注 册:2004-10-5
收藏
得分:0 
我说这位大哥, 能不能来点注释啊. 想看死人啊.

还有这实现什么功能啊.  至少也应该简要说说吧.!

[此贴子已经被作者于2005-5-20 18:13:46编辑过]



┌→¨ ≮我可以学会对你很冷落≯¨←┐ │  <却学不╓══╦══╖会将爱> │ │¨←┐ ╭╩╮哭‖哭╭╩╮ ┌→¨│ └──┘收 ╲╱ ◇‖◇ ╲╱回└──┘
2005-05-20 18:12
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
真混乱的风格啊- -

Have you visit acm.tongji. lately?
2005-05-20 22:49
深夜狼
Rank: 1
来 自:广西桂林
等 级:新手上路
帖 子:348
专家分:0
注 册:2005-5-9
收藏
得分:0 
真的是晕!
2005-05-20 23:51
快速回复:效率极高的0/1背包程序
数据加载中...
 
   



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

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