回溯法之0-1背包问题(C实现)
2015-11-01 20:55
387 查看
#include<stdio.h> int n,c,bestp;//物品的个数,背包的容量,最大价值 int p[10000],w[10000],x[10000],bestx[10000];//物品的价值,物品的重量,x[i]暂存物品的选中情况,物品的选中情况 void Backtrack(int i,int cp,int cw) { //cw当前包内物品重量,cp当前包内物品价值 int j; if(i>n)//回溯结束 { if(cp>bestp) { bestp=cp; for(i=0;i<=n;i++) bestx[i]=x[i]; } } else for(j=0;j<=1;j++) { x[i]=j; if(cw+x[i]*w[i]<=c) { cw+=w[i]*x[i]; cp+=p[i]*x[i]; Backtrack(i+1,cp,cw); cw-=w[i]*x[i]; cp-=p[i]*x[i]; } } } int main() { int i; bestp=0; printf("请输入背包最大容量:"); scanf("%d",&c); printf("请输入物品个数:"); scanf("%d",&n); printf("请依次输入物品的重量:"); for(i=1;i<=n;i++) scanf("%d",&w[i]); printf("请依次输入物品的价值:"); for(i=1;i<=n;i++) scanf("%d",&p[i]); Backtrack(1,0,0); printf("最大价值为:"); printf("%d\n",bestp); printf("被选中的物品依次是(0表示未选中,1表示选中):"); for(i=1;i<=n;i++) printf("%d ",bestx[i]); printf("\n"); system("pause"); return 0; }
运行效果图
相关文章推荐
- mysqldump详解
- Mangos源码分析(7):服务器公共组件实现之游戏主循环
- 如何开发一款优秀的APP(侧重实践层面)
- LEETCODE-Maximum Depth of Binary Tree
- iOS之OC基础类和对象
- JavaScript高级程序设计之DOM之节点层次之Element类型第10.1.3讲
- Mangos源码分析(6):登录服的设计之功能需求
- windows环境下wampserver的配置教程
- Java反射机制与实例
- JavaScript设计模式 Item 3 --封装
- 服务器结构探讨(5) -- 最终的结构
- Java 接口回调
- AsyncTaskLoader1 自定义AsyncTaskLoader使用实例:面包师
- java中的垃圾收集器
- 大型网站技术架构,阅读笔记二. 附录
- JavaScript设计模式 Item 3 --封装
- SELECT 语句总结
- DirectX 3D图形
- cf 328div 2 B. The Monster and the Squirrel
- 聚集索引和非聚集索引(整理)