BZOJ2073: [POI2004]PRZ
2017-02-13 20:01
302 查看
Portal
暴力状压,刚开始加了判断条件W[i-j]<=m,去掉以后发现竟然莫名其妙的A了。。后来发现原来是自己蠢,转移时只是将当前状态j合并到答案中,所以只用判j。
之前的做法,第二层循环巨蠢(注释掉的),虽然能过但是6000+ms。。倒数第二。改了以后直接枚举的就是j∈i,至于为什么正确,自己举个例子画一画就好了。加了一些奇奇怪怪的优化以后,快了将近20倍。。终于卡进了前50.。
暴力状压,刚开始加了判断条件W[i-j]<=m,去掉以后发现竟然莫名其妙的A了。。后来发现原来是自己蠢,转移时只是将当前状态j合并到答案中,所以只用判j。
之前的做法,第二层循环巨蠢(注释掉的),虽然能过但是6000+ms。。倒数第二。改了以后直接枚举的就是j∈i,至于为什么正确,自己举个例子画一画就好了。加了一些奇奇怪怪的优化以后,快了将近20倍。。终于卡进了前50.。
【代码】
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #define INF 1000000001 using namespace std; typedef long long ll; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } int n,m; int F[65536],T[65536],W[65536]; int main() { m=read(),n=read(); for(int i=0;i<n;i++) { static int x,y; x=read(),y=read(); for(int j=0;j<1<<n;j++) if((1<<i)&j) T[j]=max(T[j],x),W[j]+=y; } for(int i=1;i<1<<n;i++) { F[i]=INF; for(int j=i;j;j=(j-1)&i) if(W[j]<=m) //for(int j=0;j<=i;j++) if((i&j)==j&&W[j]<=m) F[i]=min(F[i],T[j]+F[i-j]); } printf("%d\n",F[(1<<n)-1]); return 0; }
相关文章推荐
- BZOJ_2073_[POI2004]PRZ_状压DP
- BZOJ 2073: [POI2004]PRZ [DP 状压]
- Bzoj2073 [POI2004] PRZ
- bzoj2073 [POI2004]PRZ
- 【BZOJ2073】[POI2004]PRZ 状压DP
- [BZOJ2073][POI2004]PRZ
- 【bzoj2073】[POI2004]PRZ
- [bzoj2073][POI2004]PRZ 状压dp
- 【bzoj2073】【[POI2004]PRZ】位运算枚举子集的特技
- BZOJ 2073: [POI2004]PRZ 状压动归
- BZOJ2073 [POI2004]PRZ
- bzoj 2073:[POI2004]PRZ 状压DP
- BZOJ 2073 [POI2004]PRZ(状压DP)
- bzoj 2073: [POI2004]PRZ
- 【BZOJ2073】【POI2004】PRZ(状压dp)
- 【bzoj2073】【[POI2004]PRZ】位运算枚举子集的特技
- BZOJ 2073: [POI2004]PRZ( 状压dp )
- bzoj 2073: [POI2004]PRZ
- bzoj2073【POI2004】PRZ
- 【BZOJ2073】【状压DP】[POI2004]PRZ 题解