80pts求助
查看原帖
80pts求助
1183074
xzy_AK_IOI楼主2025/1/15 22:12
#include<bits/stdc++.h>
using namespace std;
#define F(i,k,n) for (int i=k;i<=n;i++)
typedef long long ll;
const int N=17;
int dp[1<<N];
int wei[1<<N];
int W,n,m,a,tot;
int w[N];
bool pan[N];
int zw[N];
signed main(){
	cin>>n>>W;
	F(i,0,n-1) cin>>w[i];
	memset(dp,0x3f3f3f3f,sizeof dp);
	cin>>m;
	while (m--){tot++;
		int sum=0;
		while (1){
			cin>>a;a--;
			sum+=w[a];
			pan[a]=1;
			if (getchar()=='\n') break;
		}
		zw[tot-1]=sum;
	}
	F(i,0,n-1){
		if (!pan[i]) tot++,zw[tot-1]=w[i];
	}
	n=tot;
	F(s,1,(1<<n)-1){
		F(i,0,n-1){
			if ((s>>i)&1){
				wei[s]+=zw[i];//预处理
			}
		}
	}
	dp[0]=0;
	F(s,1,(1<<n)-1){
		for (int j=s;j>=0;j=(j-1)&s){//枚举子集
			if (wei[s-j]<=W) dp[s]=min(dp[s],dp[j]+1);
			if (!j) break;
		}
	}
	cout<<dp[(1<<n)-1];
	return 0;
}
2025/1/15 22:12
加载中...