萌新求助状压dp
查看原帖
萌新求助状压dp
674247
seanlsy楼主2022/9/21 21:57

rt,被 hack 了

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
	return f?x:-x;
}
int f[(1<<18)+5],n,w[20],g[(1<<18)+5],ww;//f:当前状态最小答案 g:当前状态取到最小答案时最后一个的剩余空间
int main(){
	memset(f,127,sizeof f);
	f[0]=1;
	n=read(),ww=read();
	for(int i=1;i<=n;i++) w[i]=read();
	for(int i=1;i<=n;i++)
		f[1<<i-1]=1,g[1<<i-1]=w[i];
	for(int i=1;i<(1<<n);i++)
		for(int j=1;j<=n;j++)
			if(i&(1<<j-1))
				if(w[j]+g[i^(1<<j-1)]<=ww&&(f[i^(1<<j-1)]<f[i]||
				(f[i^(1<<j-1)]==f[i]&&g[i^(1<<j-1)]+w[j]<g[i])))
					f[i]=f[i^(1<<j-1)],g[i]=g[i^(1<<j-1)]+w[j];
				else if(w[j]+g[i^(1<<j-1)]>ww&&(f[i^(1<<j-1)]+1<f[i]||
					(f[i^(1<<j-1)]+1==f[i]&&g[i^(1<<j-1)]+w[j]-ww<g[i])))
						f[i]=f[i^(1<<j-1)]+1,g[i]=g[i^(1<<j-1)]+w[j]-ww;
	printf("%d\n",f[(1<<n)-1]);						
    return 0;
}
2022/9/21 21:57
加载中...