【题解】洛谷P5911 :[POI2004] PRZ
状压dp,先预处理出来所以状态的重量和时间,然后枚举集合,然后枚举子集,子集重量合法的话就可以转移,因为这题是多个集合组成最后的集合。
枚举子集。
https://oi-wiki.org/math/binary-set/#__tabbed_1_1
#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
#define re register
const int N=1<<17;
const int mod=998244353;
using namespace std;
int m,n;
int a[N],b[N];
int t[N],w[N];
int f[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
for(int i=0;i<=(1<<n)-1;i++){
for(int j=1;j<=n;j++){
if(i&(1<<(j-1))){
t[i]=max(t[i],a[j]);
w[i]+=b[j];
}
}
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int i=0;i<=(1<<n)-1;i++){
for(int j=i;j;j=(j-1)&i){
if(w[j]<=m){
f[i]=min(f[i],t[j]+f[j^i]);
}
}
}
cout<<f[(1<<n)-1];
return 0;
}