洛谷:P3092 [USACO13NOV]No Change G(状压+二分,独特的状态定义,不写会后悔一辈子的题)
TP
- 一开始的思路是定义状态 dp[N][1<<16]dp[N][1<<16]dp[N][1<<16] ,维护的是能剩下最多的钱,但显然 n 那么大直接寄。
- 如何去掉 n 那一维度,百思不得其解。
- 题解教我做人:
既然维护剩下最多钱不好做,那就看看能不能维护其他东西,比如,维护能走到最远的位置。
试想,只需要 dp[i]>=ndp[i]>=ndp[i]>=n 不就代表此刻 i 状态结束购买了吗?我们显然可以统计二进制中 0 的部分,这就是没有使用的硬币价值。
对于所有这种情况的 dp,我们维护一个最大值即可,不过要注意特判无解
#include<bits/stdc++.h>
#include<unordered_map>
#define debug cout << "debug--- "
#define debug_ cout << "\n---debug---\n"
#define oper(a) operator<(const a& ee)const
#define forr(a,b,c) for(int a=b;a<=c;a++)
#define mem(a,b) memset(a,b,sizeof a)
#define cinios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define all(a) a.begin(),a.end()
#define sz(a) (int)a.size()
#define endl "\n"
#define ul (u << 1)
#define ur (u << 1 | 1)
using namespace std;typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> PII;const int N = 1e5 + 10, M = 2e6 + 10, mod = 1e8;
int INF = 0x3f3f3f3f; ll LNF = 0x3f3f3f3f3f3f3f3f;
int n, m, B = 10, ki;
int dp[1 << 16];//妙到极致的状态表示
//dp[i] 表示在 二进制 i 状态下(即使用了某某硬币)能买到的最远物品位置
//
//维护最多剩多少钱可以发现是困难的,状态要求也高,所以转变思路。
//
//我们只需要看看哪些 dp[i] >= n,然后直接算剩下硬币的钱维护一个最大值即可
//神中神至极!
//
int coin[16], c[N], pre[N];int count(int be, int money) {int l = be, r = n;//从be开始while (l < r){int mid = l + r + 1 >> 1;if (pre[mid] - pre[be] <= money)l = mid;else r = mid - 1;}return l;
}void solve() {cin >> ki >> n;for (int i = 0; i < ki; i++)cin >> coin[i];forr(i, 1, n) {cin >> c[i];pre[i] = pre[i - 1] + c[i];}ll ans = -1;//无解情况别漏了//从小状态推到大,二进制 1 的位置代表该硬币已经被用for (int i = 0; i < 1 << ki; i++) {for (int j = 0; j < ki; j++)if (i >> j & 1) {int be = dp[i - (1 << j)];dp[i] = max(dp[i], count(be, coin[j]));}if (dp[i] == n) {ll sum = 0;for (int j = 0; j < ki; j++)if ((i >> j & 1) == 0)sum += coin[j];ans = max(ans, sum);}}cout << ans;
}int main() {cinios;int T = 1;for (int t = 1; t <= T; t++) {solve();}return 0;
}
/*
*/
洛谷:P3092 [USACO13NOV]No Change G(状压+二分,独特的状态定义,不写会后悔一辈子的题)相关推荐
- 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)
题面 传送门 题解 首先要解决一个问题,就是怎么判断一个点是否在多边形内部 从这个点向某一个方向做一条射线,如果这条射线和多边形的交点为奇数说明在多边形内,否则在多边形外 然而有一些特殊情况,比方说一 ...
- 洛谷 - P2761 软件补丁问题(spfa+状压)
题目链接:点击查看 题目大意:给出 n 个错误,再给出 m 个补丁,对于每个补丁而言,设 b1,b2,f1,f2 分别为四个集合:当且仅当 b1 所表示的错误全部存在且 b2 所表示的错误没有任何一个 ...
- 洛谷P2622 关灯问题II【状压dp+bfs】
P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...
- [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
[洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...
- 洛谷P4084 [USACO17DEC]Barn Painting G 题解
洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...
- 信息学奥赛一本通 1379:热浪(heatwv) | 洛谷 P1339 [USACO09OCT]Heat Wave G
[题目链接] ybt 1379:热浪(heatwv) 洛谷 P1339 [USACO09OCT]Heat Wave G [题目考点] 1. 图论:最短路径 [解题思路] 首先抽象建模.城镇为顶点,道路 ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- 洛谷P3374 【模板】树状数组 1
题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...
- Luogu3092 [USACO13NOV]没有找零No Change (状压DP)
将金币状压,然后就没多说的了. #include <iostream> #include <cstdio> #include <cstring> #include ...
最新文章
- python使用matplotlib可视化3D柱状图(3D bar plot、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为y、改变3d图观察的角度
- java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
- mysql5.6优化建议
- Android中基于Socket的网络通信
- 史上最全亚历山大大帝名言
- c语言简答程序源代码,C语言简答题答案
- indexOf()方法的使用,截取字符串,字符串截取,切割字符串,split(),join(),Replace()
- pure tornado -- table
- volatile 用处
- spring整合hibernate事务编程中错误分析
- python 关联矩阵_创建关联矩阵
- 余世伟视频笔记----如何塑造管理者的性格魅力领袖根性之积极和大度
- 无根树任意根深度加强版
- uniapp,vue学习笔记
- 无线局域网和蜂窝移动网络_手机连上WiFi之后,你会关闭移动网络吗?这其中大有讲究...
- 如何一步步打造完美的成绩查询系统平台?
- 性能测试指标及常用的监控工具
- 手机上传日志文件给服务器,手机内容远程上传到服务器
- 如何修改桌面的存放路径?(将桌面放到D盘或E盘)
- RxJava2 Flowable debounce(过滤操作符)去重复操作
热门文章
- 青少年CTF--misc部分题解
- http 各版本问题和优化
- Win10 虚拟桌面的使用
- Cloudera Manager拓展SPARK2-2.3.0.cloudera3-1.cdh5.6.0.p0.1-el6.parcel
- 群晖硬盘已损毁 Linux 修复,今天群晖存储空间损毁,起死回生
- 一篇难得的关于傅里叶分析的好文
- QueryList异步抓取网页数据
- DER 和 PEM 格式
- WINDOWS更改无线网卡MAC地址的方法
- 四天搞懂生成对抗网络(一)——通俗理解经典GAN