0-1背包问题——使用动态规划方法解决
2011-03-21 10:09
477 查看
思路:向后处理法
fi(x)=max{fi-1(x), fi-1(x-wi)+pi}
算法空间复杂度是O(2^n),但是由于M比2^n小很多,而且根据支配规则(wi>wj时,必须有pi>pj)可以清楚一些不满足条件的序偶,故实际上,算法是可行的。
fi(x)=max{fi-1(x), fi-1(x-wi)+pi}
/* 背包问题——使用动态规划方法解决 */ #include <stdio.h> void DKNAP_Pack(float p[], float w[], float M, int n, int x[]) { float P[1000],W[1000],pp,ww; int F[100]; int i,j,k,l,h,next,u; l = h = 1; F[0] = 1; P[1] = W[1] = 0; F[1] = next = 2; for(i=1; i<n; i++) { k = l; u = l; while(u<=h && W[u]+w[i]<M) u++; if(u>h) u--; for(j=l; j<=u; j++) { pp = P[l] + p[i]; ww = W[l] + w[i]; while(k<=h && W[k]<ww) { P[next] = P[k]; W[next] = W[k]; next++; k++; }; if(k<=h && W[k]==ww) { if(P[k] > pp) pp = P[k]; k++; } if(pp > P[next-1]) { P[next] = pp; W[next] = ww; next++; } while(k<=h && P[k]<=P[next-1]) k++; }//for while(k<=h) { P[next] = P[k]; W[next] = W[k]; next++; k++; } l = h+1; h = next-1; F[i+1] = next; }//for /*有了S(n-1),求最终答案*/ i = F[n-1]; while(i<F && w +W[i]<=M) i++; i--; if(P[i]+p > P[F -1]) { P[F ] = P[i]+p ; W[F ] = W[i]+w ; }else { P[F ] = P[F -1]; W[F ] = W[F -1]; } printf("P=%f, W=%f./n", P[F ], W[F ]); /*求x ,即w的组成成分*/ for(i=0; i<=n; i++) printf("%d ",F[i]); printf("Ouput p and w:/n"); for(i=F[0]; i<=F ; i++) printf("%f %f/n",P[i], W[i]); printf("/n"); pp = P[F ]; ww = W[F ]; for(i=n-1; i>=0; i--) { j=F[i]; x[i+1] = 0; while(j<F[i+1]) { if(pp==P[j] && ww==W[j]) { x[i+1] = 0; break; } if(pp-p[i+1]==P[j] && ww-w[i+1]==W[j]) { x[i+1] = 1; pp = pp-p[i+1]; ww = ww-w[i+1]; break; } j++; }//while }//for } int main() { int i, n, x[10]; float p[10],w[10],M; M = 6; n = 3; p[1] = 1; p[2] = 2; p[3] = 5; w[1] = 2; w[2] = 3; w[3] = 4; DKNAP_Pack(p, w, M, n, x); for(i=1; i<=n; i++) printf("%d ",x[i]); getchar(); getchar(); getchar(); return 0; }
算法空间复杂度是O(2^n),但是由于M比2^n小很多,而且根据支配规则(wi>wj时,必须有pi>pj)可以清楚一些不满足条件的序偶,故实际上,算法是可行的。
相关文章推荐
- 0-1背包问题之使用回溯法解决
- 对使用倒序的一维数组解决0/1背包问题的理解
- C#使用回溯法解决背包问题实例分析
- 使用动态规划法解决0/1背包问题
- C#使用动态规划解决0-1背包问题实例分析
- 使用adagio包解决背包问题
- 使用wechatpy解决多核情况下,token与ticket的刷新问题
- 前台使用js的encodeURIComponent编码后,java解析乱码问题的解决方法
- 使用jspsmartupload解决表单属性为multipart/form-data不能传其他参数的问题
- Microsoft Office Word 2007 切换窗口后鼠标无法使用问题的解决办法
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- source Insight 使用时的问题解决!!
- 非MFC工程使用MFC库时的问题及解决办法
- PushMeBaby 的使用问题及解决方法
- 解决RecyclerView中使用权重后图片不显示问题
- Spring Boot使用Feign客户端调用远程服务时出现:timed-out and no fallback available,failed and no fallback available的问题解决
- 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
- 数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题
- sublime text2 使用-安装插件-中文乱码问题解决
- 关于控制Dcom程序使用端口的问题及解决方式