• P4377 [USACO18OPEN]Talent Show


    一眼过去,`0 / 1分数规划`裸题。 但是仔细一想,贪心不对,那么没办法判断重量与比率同时满足关系。 分析发现其实是一个 `二元组`,可以转化成01背包做。 注意此处因为只需要判断可行性,那么01背包只需要记录到W即可,像这样:
    f[min(W, j + w[i])] = max(f[min(W, j + w[i])], f[j] + p[i]);
    

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int MAXN = 250 + 10;
    
    int N, W;
    int w[MAXN], t[MAXN];
    
    double p[MAXN]; double f[1010];
    inline bool check(double x)
    {
    	for(int i = 1; i <= N; i++) p[i] = 1.0 * t[i] - 1.0 * x * w[i];
    	fill(f, f + W + 1, -(1 << 29));
    	f[0] = 0;
    	for(int i = 1; i <= N; i++){
    		for(int j = W; j >= 0; j--)
    			f[min(W, j + w[i])] = max(f[min(W, j + w[i])], f[j] + p[i]);
    	}
     	return f[W] >= 0;
    }
    
    int main()
    {
    	cin>>N>>W;
    	double l = 0, r = 0;
    	for(int i = 1; i <= N; i++) 
    		scanf("%d%d", &w[i], &t[i]), r += t[i];
    
    	while(r - l > 1e-4){
    		double mid = (l + r) / 2;
    		if(check(mid)) l = mid;
    		else r = mid;
    	}
     	cout<<(int)(l * 1000)<<endl;
    	return 0;
    }
    
    
  • 相关阅读:
    hdu 1312 ( Red and Black )
    hdu 1429 ( 胜利大逃亡(续) )
    zjut 小X的苹果
    hdu 1253 ( 胜利大逃亡 )
    许多事
    1198 ( Farm Irrigation )
    hdu 1241 Oil Deposits
    hdu 1242 ( Rescue )
    hdu 1240 ( Asteroids! )
    zoj2966 build the electric system
  • 原文地址:https://www.cnblogs.com/wsmrxc/p/9419468.html
Copyright © 2020-2023  润新知