题目:PRZ
解析:
本来是道傻逼状压枚举子集的题,因为数组开小了WA了半天。。。
数组一定要尽量开大!!
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=17;
int n,m,tot;
int t[Max],w[Max],bin[Max];
int f[1<<17],p[1<<17],s[1<<17];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void init()
{
m=get_int(),n=get_int();
for(int i=0;i<n;i++) t[i]=get_int(),w[i]=get_int();
}
inline void pre()
{
bin[0]=1;int sum=0,maxx=0;
for(int i=1;i<=16;i++) bin[i]=bin[i-1]<<1;
for(int j=1;j<bin[n];j++)
{
sum=0,maxx=0;
for(int i=0;i<n;i++) if(((1<<i)&j)) sum+=w[i],maxx=max(maxx,t[i]);
if(sum<=m) p[++tot]=j,s[tot]=maxx;
}
}
inline void solve()
{
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=0;i<bin[n];i++)
if(f[i]<1000000000)
for(int j=1;j<=tot;j++)
if(!(p[j]&i))
f[i|p[j]]=min(f[i|p[j]],f[i]+s[j]);
cout<<f[bin[n]-1];
}
int main()
{
init();
pre();
solve();
return 0;
}