zoukankan      html  css  js  c++  java
  • [POI2004]PRZ [枚举子集]

    怎么全是 模拟退火 啊,这明明是个 枚举子集 的板子题。

    考虑 (n leq 16) 二进制没错了。。

    (dt_i) 表示 (i) 这个状态下 (max{t_j}),([ exttt{i&(1<<j)}])

    (dw_i) 表示 (i) 这个状态下
    (sum w_j),([ exttt{i&(1<<j)}])

    (dp_i) 表示 (i) 这个状态下的最少时间

    时间复杂度 (O(3^n))
    空间复杂度 (O(2^n))

    #include <bits/stdc++.h>
    #define rep(i , x , y) for(register int i = x ; i <= y ; i ++)
    
    #define int long long
    using namespace std ;
    
    signed main() {
    	ios :: sync_with_stdio(false) ;
    	cin.tie(nullptr) ;
    	cout.tie(nullptr) ;
    	int W , n ;
    	cin >> W >> n ;
    	vector < int > t(n) , w(n) ;
    	for(int i = 0 ; i < n ; i ++)
    		cin >> t[i] >> w[i] ;
    	vector < int > dt(1 << n) , dw(1 << n) ;
    	for(int i = 0 ; i < 1 << n ; i ++) {
    		for(int j = 0 ; j < n ; j ++) {
    			if(i & (1 << j)) continue ;
    			dt[i | (1 << j)] = max(dt[i] , t[j]) ;
    			dw[i | (1 << j)] = dw[i] + w[j] ;
    		}
    	}
    	vector < int > dp(1 << n , 999) ;
    	dp[0] = 0 ;
    	for(int i = 1 ; i < 1 << n ; i ++) {
    		for(int j = i ; j ; j = (j - 1) & i) 
    			if(dw[j] <= W) dp[i] = min(dp[i] , dt[j] + dp[i ^ j]) ;
    	}
    	cout << dp[(1 << n) - 1] << '
    ' ;
    	return 0 ;
    }
    
  • 相关阅读:
    NOIP普及组2003经验总结
    Day6上午 DP练习题
    Day4 图论
    Day3 数据结构
    使用ettercap进行dns欺骗和获取目标浏览的图片
    flask入门
    攻防世界-web-unserialize3
    数据结构课设作业-----飞机订票系统
    bugku NaNNaNNaNNaN-Batman
    it's a test
  • 原文地址:https://www.cnblogs.com/Isaunoya/p/12240874.html
Copyright © 2011-2022 走看看