旅行商的背包(二进制优化多重+0/1背包枚举体积))

题目描述

小 S 坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商。在出发之前,他购进了一些物品。这些物品共有 n n n 种,第 i i i 种体积为 V i V_i Vi​,价值为 W i W_i Wi​,共有 D i D_i Di​ 件。他的背包体积是 C C C。怎样装才能获得尽量多的收益呢?作为一名大神犇,他轻而易举的解决了这个问题。

然而,就在他出发前,他又收到了一批奇货。这些货共有 m m m 件,第 i i i 件的价值 Y i Y_i Yi​ 与分配的体积 X i X_i Xi​ 之间的关系为: Y i = a i X i 2 + b i X i + c i Y_i=a_iX_i^2+b_iX_i+c_i Yi​=ai​Xi2​+bi​Xi​+ci​。这是件好事,但小 S 却不知道怎么处理了,于是他找到了一位超级神犇(也就是你),请你帮他解决这个问题。

输入格式

第一行三个数 n , m , C n,m,C n,m,C,如题中所述;

以下 n n n 行,每行有三个数 V i , W i , D i V_i,W_i,D_i Vi​,Wi​,Di​,如题中所述;

以下 m m m 行,每行有三个数 a i , b i , c i a_i,b_i,c_i ai​,bi​,ci​,如题中所述。

输出格式

仅一行,为最大的价值。

样例 #1

样例输入 #1

2 1 10
1 2 3
3 4 1
-1 8 -16

样例输出 #1

10

提示

样例解释

前两种物品全部选走,最后一个奇货分给 4 4 4 的体积,收益为 2 × 3 + 4 × 1 + ( − 1 ) × 16 + 8 × 4 + ( − 16 ) = 10 2 \times 3+4 \times 1+(-1) \times 16+8 \times 4+(-16)=10 2×3+4×1+(−1)×16+8×4+(−16)=10。

限制与约定

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1≤n≤104, 1 ≤ m ≤ 5 1 \le m \le 5 1≤m≤5, 1 ≤ C ≤ 1 0 4 1 \le C \le 10^4 1≤C≤104,$
1 \le W_i,V_i,D_i \le 1000 , , ,-1000 \le a_i,b_i,c_i \le 1000$。


显然是一道混合背包。

独立拿到60分!

/*
A: 10min
B: 20min
C: 30min
D: 40min
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <assert.h>
#include <sstream>
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mem(f, x) memset(f,x,sizeof(f))
#define fo(i,a,n) for(int i=(a);i<=(n);++i)
#define fo_(i,a,n) for(int i=(a);i<(n);++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
#define endl '\n'
using namespace std;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")template<typename T>
ostream& operator<<(ostream& os,const vector<T>&v){for(int i=0,j=0;i<v.size();i++,j++)if(j>=5){j=0;puts("");}else os<<v[i]<<" ";return os;}
template<typename T>
ostream& operator<<(ostream& os,const set<T>&v){for(auto c:v)os<<c<<" ";return os;}
template<typename T1,typename T2>
ostream& operator<<(ostream& os,const map<T1,T2>&v){for(auto c:v)os<<c.first<<" "<<c.second<<endl;return os;}
template<typename T>inline void rd(T &a) {char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}typedef pair<long long ,long long >PII;
typedef pair<long,long>PLL;typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+10,M=1e9+7;int n1,n2,m;
ll f[11000],dp[11000];
void solve(){cin>>n1>>n2>>m;for(int i=1;i<=n1;i++){ll v,w,d;cin>>v>>w>>d;for(int j=m;j>=v;j--){for(int k=0;k<=d && j>=k*v;k++){f[j] = max(f[j],f[j-k*v]+k*w);}}}for(int i=1;i<=n2;i++){ ll a,b,c;cin>>a>>b>>c;for(int j=m;j>=0;j--){for(int v=0;v<=j;v++){ll w = a*v*v+b*v+c;dp[j] = max(dp[j],dp[j-v]+w);}}}ll ans = 0;for(int i=0;i<=m;i++){ans = max(ans,f[i]+dp[m-i]);}cout<<ans<<endl;
}int main(){solve();return 0;
}

o r z orz orz 吸氧大法好,给上边的代码加了二进制枚举还是 T T T ,吸氧之后直接 A A A 了,然后qwq,上边的代码吸氧也能过!?

/*
A: 10min
B: 20min
C: 30min
D: 40min
*/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <assert.h>
#include <sstream>
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mem(f, x) memset(f,x,sizeof(f))
#define fo(i,a,n) for(int i=(a);i<=(n);++i)
#define fo_(i,a,n) for(int i=(a);i<(n);++i)
#define debug(x) cout<<#x<<":"<<x<<endl;
#define endl '\n'
using namespace std;
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")template<typename T>
ostream& operator<<(ostream& os,const vector<T>&v){for(int i=0,j=0;i<v.size();i++,j++)if(j>=5){j=0;puts("");}else os<<v[i]<<" ";return os;}
template<typename T>
ostream& operator<<(ostream& os,const set<T>&v){for(auto c:v)os<<c<<" ";return os;}
template<typename T1,typename T2>
ostream& operator<<(ostream& os,const map<T1,T2>&v){for(auto c:v)os<<c.first<<" "<<c.second<<endl;return os;}
template<typename T>inline void rd(T &a) {char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}typedef pair<long long ,long long >PII;
typedef pair<long,long>PLL;typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+10,M=1e9+7;int n1,n2,m;
ll f[11000],dp[11000];
struct good{ll v,w;
};
vector<good>g;
void solve(){cin>>n1>>n2>>m;for(int i=1;i<=n1;i++){ll v,w,d;cin>>v>>w>>d;for(int k=1;k<=d;k<<=1){g.pb({k*v,k*w});d-=k;}if(d>0){g.pb({d*v,d*w});}}for(auto c:g){ll v = c.v, w = c.w;for(int j=m;j>=v;j--){f[j] = max(f[j],f[j-v] + w);}}for(int i=1;i<=n2;i++){   ll a,b,c;cin>>a>>b>>c;for(int j=m;j>=0;j--){for(int v=0;v<=j;v++){ll w = a*v*v+b*v+c;dp[j] = max(dp[j],dp[j-v]+w);}}}ll ans = 0;for(int i=0;i<=m;i++){ans = max(ans,f[i]+dp[m-i]);}cout<<ans<<endl;
}int main(){solve();return 0;
}

but,如何优化呢?

看完题解,好像这题卡常离谱,鉴于 学过单调队列优化多重还是忘 就先算了

旅行商的背包(二进制优化多重+0/1背包枚举体积))相关推荐

  1. [多重背包+二进制优化]HDU1059 Dividing

    题目链接 题目大意: 两个人要把一堆宝珠,在不能切割的情况下按照价值平分,他们把宝珠分成6种价值,每种价值的宝珠n个. n<=200000 思考: 首先如果加和下来的价值是一个偶数 那么还分毛啊 ...

  2. hdu-2844 Coins (混合背包+二进制优化)

    HDU链接 文章目录 题目描述: 题意: 题解 (代码) 题目描述: 输入描述: 输出描述: For each test case output the answer on a single line ...

  3. zcmu Problem C: kirito's 星爆气流斩(背包+二进制优化)

    [题目] Problem C: kirito's 星爆气流斩 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 143  Solved: 34 [Subm ...

  4. POJ 1014 Dividing【多重背包+二进制优化】

    大意: 价值1, 2, 3, --, 6的物品分别a1, a2, --, a5, a6件 问能否把这些物品分成两份,使其具有相同的价值(所有物品必须全部用上) 分析: 给个物品有多件,即多重背包 只要 ...

  5. zcmu-1919: kirito(多重背包——二进制优化)

    Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...

  6. 1919: kirito's 星爆气流斩(多重背包转换为01背包+二进制优化)

    Description 主角kirito是使用世界首款完全潜行游戏"刀剑神域(Sword Art Online)"的玩家.曾经很幸运的参与过封闭测试,并买下正式版的kirito,正 ...

  7. HDU 5445 Food Problem 多重背包+二进制优化

    据说也可以用单调队列优化多重背包,但是我不会,所以还是选择了二进制优化... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:先给n,m, ...

  8. Dividing(多重背包二进制优化)

    题意:有价值为1-6的六种玻璃球,现在告诉你各种玻璃球的个数,问能否将这些玻璃球分成两份,使得两份的总价值相等 既然要等分,那么总价值必定是偶数,所以价值和为奇数是无法等分. 但价值和为偶数时,我们可 ...

  9. 【二进制优化-多重背包】zznu-oj-2120 : 安详--如何用尽钱币打赏主播获得最大好感度...

    2120 : 安详 题目描述 spring最近喜欢上了B站新秀主播,身为顿顿吃黄焖鸡的土豪,当然要过去打赏一番,但是spring还是喜欢精打细算,所以在打赏的时候,想要掏出有限的钱,获得主播的最大好感 ...

最新文章

  1. 传说中的WCF(5):数据协定(a)
  2. 自然语言处理期末复习(1)n元模型
  3. Hibernate持久化对象三种状态
  4. JavaScript和ABAP的MD5计算源代码
  5. 读再多书都没觉得自己变强?试试我这“5年陈”的方法
  6. NOIP201202寻宝
  7. 同步设备IO与异步设备IO
  8. django-如何debug
  9. azure不支持哪些语句 sql_排查 Azure SQL 数据库的常见连接问题 - Azure SQL Database | Microsoft Docs...
  10. [转]setTimeout() 函数未定义错误
  11. 关键字:auto、static、register、const、volatile 、extern 总结
  12. python实现登录抓取_Python网页抓取、模拟登录
  13. js-事件处理(重点)
  14. VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?
  15. Excel技巧[EXCEL 下拉填充公式,保持公式部分内容不变,使用绝对引用]
  16. LTE技术派报告:LTE抛弃了CDMA?
  17. 【leetcode】1419. Minimum Number of Frogs Croaking
  18. html图片轮播种类,支持4种类型的jQuery轮播图插件EasySlides
  19. jsptitle换行_fullcalendar中title内容过长显示不全的问题
  20. 显示器会影响电脑的显示效果么

热门文章

  1. 学校人员定位管理系统
  2. idea页面只能显示一个项目,idea使用教程——一个窗口中同时打开多个项目
  3. 性价比超高,铁威马F4-423(4G)正式上线!
  4. 2023年最新水果编曲软件Image-Line FL Studio 21 制作人版免费下载安装激活
  5. php两个json怎么合并,合并两个json字符串
  6. 小米和MAC触摸板手势汇总
  7. 太原免费学计算机,太原锦华计算机学校官网-山西专业的电脑学校,专注电脑教育16年,电脑培训就选择锦华电脑学校...
  8. python做事务所审计收费标准_会计师事务所审计收费标准|会计师事务所审计实习报告...
  9. 【瑞萨RA系列FSP库开发】串口烧录(Renesas Flash Programmer)
  10. 【第十篇】Thymeleaf模板引擎