• 洛谷P1782 旅行商的背包


    传送门啦

    这个题不用二进制优化的话根本不行,现学的二进制优化,调了一段时间终于A了,不容易。。

    如果不懂二进制优化的话可以去看我那个博客

    二进制优化多重背包入口

    不想TLE,不要打memset,一定要用快读,听别人说不用快读卡三个点,幸亏我习惯打快读。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 10005;
    
    inline int read(){
    	char ch = getchar();
    	int f = 1 ,x = 0;
    	while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
    	while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
    	return x * f;
    }
    
    int n,m,C,v[maxn],w[maxn],d[maxn],a[maxn],b[maxn],c[maxn];
    long long f[maxn];
    
    int main(){
    	n = read(); m = read(); C = read();
    	for(int i=1;i<=n;i++) {
    		v[i] = read(); w[i] = read(); d[i] = read();
    		if(d[i] * v[i] > C){
    			for(int j=v[i];j<=C;j++)
    				f[j] = max(f[j] , f[j - v[i]] + w[i]);
    		}
    		else {
    			for(int k=1;k<=d[i];k<<=1){
    				for(int j=C;j>=v[i]*k;j--)
    					f[j] = max(f[j] , f[j - v[i] * k] + w[i] * k);
    				d[i] -= k;
    			}
    		}
    		if(d[i] > 0){
    			for(int j=C;j>=v[i]*d[i];j--)
    				f[j] = max(f[j] , f[j - v[i] * d[i]] + w[i] * d[i]);
    		}
    	}
    	for(int i=1;i<=m;i++){
    		a[i] = read(); b[i] = read(); c[i] = read();
    		for(int j=C;j>=0;j--)
    			for(int k=0;k<=j;k++)
    				f[j] = max(f[j] , f[j - k] + (a[i] * k + b[i]) * k + c[i]);
    	}
    	printf("%lld",f[C]);
    	return 0;
    }
    顺风不浪,逆风不怂。
  • 相关阅读:
    点击两次返回键程序退出
    权限android.permission.WRITE_EXTERNAL_STORAGE 内外置sd卡写权限
    java Calendar add方法
    MeasureSpec简介
    android bitmap转换
    IOS键盘隐藏和显示调用
    内存溢出
    UIView递归
    caLayer
    C++算法
  • 原文地址:https://www.cnblogs.com/Stephen-F/p/9877326.html
Copyright © 2020-2023  润新知