博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0x22 迭代加深
阅读量:4637 次
发布时间:2019-06-09

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

poj2248 真是个新套路。还有套路剪枝...大到小和判重

#include
#include
#include
#include
#include
#include
#include
using namespace std;int n,D,x[110];bool bk,v[110][110];void dfs(int k){ if(bk==true)return ; if(k==D+1)return ; if(x[k-1]>n)return ; if(x[k-1]==n) { bk=true; for(int i=1;i
=1;i--) { if(x[i]+x[i]
=1;j--) { if(x[i]+x[j]
poj2248

送礼物 折半搜索(orz cgh队长之前教我),书上叫双向搜索。又双叒叕有套路剪枝...大到小和很明显的可行性。结果dfs时居然还要先尝试选再尝试不选。。无语

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int n;int W,c[110];bool cmp(int x,int y){ return x>y;}int len;int a[10001000];inline void dfs(int k,int d){ if(k==n/2+1) { a[++len]=d; return ; } if(((LL)d)+c[k]<=W)dfs(k+1,d+c[k]); dfs(k+1,d);}int mmax;int erfen(int k){ int l=1,r=len;int ans; while(l<=r) { int mid=(l+r)/2; if(a[mid]<=k) { ans=a[mid]; l=mid+1; } else r=mid-1; } return ans;}inline void dfs2(int k,int d){ if(k==n+1) { mmax=max(mmax,d+erfen(W-d));return ; } if(((LL)d)+c[k]<=W)dfs2(k+1,d+c[k]); dfs2(k+1,d);}int main(){ scanf("%d%d",&W,&n); for(int i=1;i<=n;i++)scanf("%d",&c[i]); sort(c+1,c+n+1,cmp); len=0;dfs(1,0); sort(a+1,a+len+1);len=unique(a+1,a+len+1)-a-1; mmax=a[len]; dfs2(n/2+1,0); printf("%d\n",mmax); return 0;}#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int n;int W,c[110];bool cmp(int x,int y){ return x>y;}int len;int a[10001000];inline void dfs(int k,int d){ if(k==n/2+1) { a[++len]=d; return ; } if(((LL)d)+c[k]<=W)dfs(k+1,d+c[k]); dfs(k+1,d);}int mmax;int erfen(int k){ int l=1,r=len;int ans; while(l<=r) { int mid=(l+r)/2; if(a[mid]<=k) { ans=a[mid]; l=mid+1; } else r=mid-1; } return ans;}inline void dfs2(int k,int d){ if(k==n+1) { mmax=max(mmax,d+erfen(W-d));return ; } if(((LL)d)+c[k]<=W)dfs2(k+1,d+c[k]); dfs2(k+1,d);}int main(){ scanf("%d%d",&W,&n); for(int i=1;i<=n;i++)scanf("%d",&c[i]); sort(c+1,c+n+1,cmp); len=0;dfs(1,0); sort(a+1,a+len+1);len=unique(a+1,a+len+1)-a-1; mmax=a[len]; dfs2(n/2+1,0); printf("%d\n",mmax); return 0;}
送礼物

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/9270121.html

你可能感兴趣的文章
内存对齐
查看>>
C++对象内存布局,this指针,对象作为参数,作为返回值
查看>>
BCB6 如何跨工程(Project)进行源码级调试
查看>>
proc near/far
查看>>
Dllmain的作用
查看>>
mov offset和lea的区别
查看>>
win7虚拟机安装
查看>>
C++中继承 声明基类析构函数为虚函数作用,单继承和多继承关系的内存分布
查看>>
C++编译器和连接器原理
查看>>
read命令
查看>>
echo如何输出带颜色的文本
查看>>
PComm串口开发
查看>>
git命令详解
查看>>
C++函数声明后面加throw()的作用
查看>>
XA 事务
查看>>
C++ 模板元编程 学习笔记
查看>>
静态联编与动态联编
查看>>
虚函数本质
查看>>
异质链表
查看>>
linux 学习笔记二
查看>>