zoukankan      html  css  js  c++  java
  • Luogu P3985 不开心的金明

    (题目链接)

    Solution

    简单来说就是01背包问题,但是物品最大数量为 (100), 物品重量和价值都 (leq 10^9),但是保证极差(最大值减最小值) (leq 3)

    机房大佬给我说了这个题想了一下就胡出来做法了,但是一开始写挂了233333

    先把所有的重量都减去它们的最小值,则剩下的重量一定都 (leq 3)。剩下就比较简单了。

    (w[i]) 表示第 (i) 个物品的重量(减去最小值), (v[i]) 表示第 (i) 个物品的质量, 计 (minn) 为原先重量的最小值。

    (f[i][j]) 为选 (i) 个物品,重量为 (j) (已经减去重量的最小值)的最大价值。

    对于选第 (i) 个物品对这个进行更新,有:

    [f[j][k]=max{f[j-1][k-w[i]]+v[i]} (j*minn+kleq m,w[i]leq k leq j*3) ]

    因为为01背包,所以 (j)(k) 都是倒序循环。

    感性理解一下,(j) 代表选择了几个物品,(k) 代表选择的 (sum w[l]) 的值,此时此刻的答案。

    (j*minn+kleq m) 就是满足选出的物品在背包容量内,(w[i]leq k leq j*3) 这里的范围是 (k) 所有可能的取值,因为 (max{sum{w[l]}}=j*3) 就是 (w)全都是 (3) 的情况,(min{sum{w[l]}}=w[i]) 就是前面 (w) 全是 (0) 的情况。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    #define int long long
    inline int Max(int x, int y) { return x > y ? x : y; }
    inline int Min(int x, int y) { return x < y ? x : y; }
    inline int read() {
    	int r = 0; bool w = 0; char ch = getchar();
    	while(ch < '0' || ch > '9') {
    		if(ch == '-') w = 1;
    		ch = getchar();
    	}
    	while(ch >= '0' && ch <= '9') {
    		r = (r << 3) + (r << 1) + (ch ^ 48);
    		ch = getchar();
    	}
    	return w ? ~r + 1 : r;
    }
    #undef int
    const int N = 1100;
    const int W = 3300;
    const ll INF = 0x7fffffffffffffff;
    int n, m;
    ll w[N], v[N], minn = INF;
    ll f[N][W], ans;
    int main() {
    	n = read(); m = read();
    	for(int i = 1; i <= n; ++i) w[i] = read(), v[i] = read(), minn = Min(minn, w[i]);
    	for(int i = 1; i <= n; ++i) w[i] -= minn;
    	for(int i = 1; i <= n; ++i) {
    		for(int j = n; j >= 1; --j)
    			for(int k = j * 3; k >= w[i]; --k) {
    				if(j * minn + k <= m) f[j][k] = Max(f[j][k], f[j - 1][k - w[i]] + v[i]);
    				ans = Max(ans, f[j][k]);
    			}
    	}
    	printf("%lld
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    Django之ORM基础
    Django基本命令
    Django知识总汇
    Linux Shell 自动化之让文本飞
    伪类link,hover,active,visited,focus的区别
    小记 Linux 之 Vim
    恢复 MSSQL bak 文件扩展名数据(上)
    小记一次shellscript的麻烦
    Java 之多态
    Java 之封装
  • 原文地址:https://www.cnblogs.com/do-while-true/p/13822251.html
Copyright © 2011-2022 走看看