BZOJ2073: [POI2004]PRZ

时间:2023-03-09 16:00:32
BZOJ2073: [POI2004]PRZ

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2073

题解:跟风Xs酱!

数据范围这么小,肯定是状压DP。咦?怎么枚举子集?。。。

跪烂Xs:http://www.cnblogs.com/rausen/p/4263790.html

代码:

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 100000+5
#define maxm 100000+5
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,mx,a[],b[],bin[],s[maxn],t[maxn],f[maxn];
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
mx=read();n=read();
for1(i,n)a[i]=read(),b[i]=read();
bin[]=;
for1(i,n)bin[i]=bin[i-]<<;
for1(i,bin[n]-)for1(j,n)if(i&bin[j-])t[i]=max(t[i],a[j]),s[i]+=b[j];
memset(f,,sizeof(f));
f[]=;
for1(i,bin[n]-)
for(int j=i;j;j=i&(j-))
if(s[j]<=mx)f[i]=min(f[i],t[j]+f[i^j]);
cout<<f[bin[n]-]<<endl;
return ;
}

以后也用bin[i]表示1<<i吧,用一次写一次的话可能会出现各种奇怪的问题。。。