【题解】洛谷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;
}
posted @ 2024-11-25 19:08  sad_lin  阅读(0)  评论(0编辑  收藏  举报