博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 4777 Watashi's BG DFS解决01背包
阅读量:5244 次
发布时间:2019-06-14

本文共 1422 字,大约阅读时间需要 4 分钟。

本来想的算法是如果V<=100000就直接进行01背包时间复杂度为O(30*100000),如果大于100000大于部分贪心选择,剩余部分在进行01背包,可是中间会出现很多问题,大于部分的的处理不好弄,如果100000加上处理后的剩余部分会出现数组越界,再说有的数据也不会过,这只是一种yy的方法,不对。

后来据说是爆搜解决01背包想了想时间复杂度能够达到(10^9自己不敢写,竟没有想到剪枝弄好了能够过,于是就写了起来,这里首先从大到小排序,这样大的在前边保证先装大的,背包容量就会变小再加剪枝就能过了。

View Code
#include 
#include
#define maxn 44using namespace std;int w[maxn],n,b[maxn];int V,ans;int cmp(int a,int b){ return a > b;}void dfs(int sum,int num){ if (sum > V) return ; if (num >= n) { ans = max(ans,sum); return ; } int tmp = sum; if (num > 0) tmp += (b[n - 1] - b[num - 1]);//如果当前加上剩余没有选的物品的总和小于原来最大的 if (tmp < ans) return ; dfs(sum + w[num],num + 1); dfs(sum,num + 1);}int main(){ int i,ni; while (~scanf("%d%d",&ni,&V)) { for (int i = 0; i < ni; ++i) scanf("%d",&w[i]); int s = 0; n = 0; for (int i = 0; i < ni; ++i) { b[i] = 0; if (w[i] <= V)//将大于总容量的物品剪掉 { w[n++] = w[i]; s += w[i]; } } if (s <= V)//总和小于总容量 { printf("%d\n",s); continue; } sort(w,w + n,cmp); //b记录前i项和 b[0] = w[0]; for (i = 1; i < n; ++i) b[i] = b[i - 1] + w[i]; ans = 0; dfs(0,0); printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/E-star/archive/2012/07/30/2614860.html

你可能感兴趣的文章
html标签的嵌套规则
查看>>
10个实用的但偏执的Java编程技术
查看>>
sql语句查询出数据重复,取唯一数据
查看>>
GitHub上史上最全的Android开源项目分类汇总
查看>>
后台运行命令:&amp;和nohup command &amp; 以及关闭、查看后台任务
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
c# 读/写文件(各种格式)
查看>>
iOS中用UIWebView的loadHTMLString后图片和文字失调解决方法
查看>>
【校招面试 之 C/C++】第24题 C++ STL(六)之Map
查看>>
android基础知识杂记
查看>>
常见浏览器兼容性问题与解决方式
查看>>
Python使用subprocess的Popen要调用系统命令
查看>>
网络编程学习小结
查看>>
常见浏览器兼容性问题与解决方式
查看>>
redis.conf 配置详解
查看>>
thinkphp volist if标签 bug
查看>>
Struts2 Action
查看>>
Strut2------源码下载
查看>>