TP

既然维护剩下最多钱不好做,那就看看能不能维护其他东西,比如,维护能走到最远的位置

这个 走到最远位置 是抽象的表述,实际定义 dp[1<<16]dp[1<<16]dp[1<<16]
dp[i]表示在二进制i状态下(即使用了某些硬币)能买到的最远物品位置dp[i] 表示在 二进制 i 状态下(即使用了某些硬币)能买到的最远物品位置dp[i]表示在二进制i状态下(即使用了某些硬币)能买到的最远物品位置

试想,只需要 dp[i]>=ndp[i]>=ndp[i]>=n 不就代表此刻 i 状态结束购买了吗?我们显然可以统计二进制中 0 的部分,这就是没有使用的硬币价值。

对于所有这种情况的 dp,我们维护一个最大值即可,不过要注意特判无解

只能说神中神中神中神,不写后悔一个acm生涯

Code:Code:Code:

#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(状压+二分,独特的状态定义,不写会后悔一辈子的题)相关推荐

  1. 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)

    题面 传送门 题解 首先要解决一个问题,就是怎么判断一个点是否在多边形内部 从这个点向某一个方向做一条射线,如果这条射线和多边形的交点为奇数说明在多边形内,否则在多边形外 然而有一些特殊情况,比方说一 ...

  2. 洛谷 - P2761 软件补丁问题(spfa+状压)

    题目链接:点击查看 题目大意:给出 n 个错误,再给出 m 个补丁,对于每个补丁而言,设 b1,b2,f1,f2 分别为四个集合:当且仅当 b1 所表示的错误全部存在且 b2 所表示的错误没有任何一个 ...

  3. 洛谷P2622 关灯问题II【状压dp+bfs】

    P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...

  4. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)

    [洛谷 P4084 USACO17DEC] Barn Painting G 题目链接 大致题意: 给定一颗N个节点组成的树,3种颜色,其中K个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数 ...

  5. 洛谷P4084 [USACO17DEC]Barn Painting G 题解

    洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...

  6. 信息学奥赛一本通 1379:热浪(heatwv) | 洛谷 P1339 [USACO09OCT]Heat Wave G

    [题目链接] ybt 1379:热浪(heatwv) 洛谷 P1339 [USACO09OCT]Heat Wave G [题目考点] 1. 图论:最短路径 [解题思路] 首先抽象建模.城镇为顶点,道路 ...

  7. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  8. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  9. Luogu3092 [USACO13NOV]没有找零No Change (状压DP)

    将金币状压,然后就没多说的了. #include <iostream> #include <cstdio> #include <cstring> #include ...

最新文章

  1. python使用matplotlib可视化3D柱状图(3D bar plot、三维柱状图、包含三个坐标轴x、y、z)、设置zdir参数为y、改变3d图观察的角度
  2. java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解
  3. mysql5.6优化建议
  4. Android中基于Socket的网络通信
  5. 史上最全亚历山大大帝名言
  6. c语言简答程序源代码,C语言简答题答案
  7. indexOf()方法的使用,截取字符串,字符串截取,切割字符串,split(),join(),Replace()
  8. pure tornado -- table
  9. volatile 用处
  10. spring整合hibernate事务编程中错误分析
  11. python 关联矩阵_创建关联矩阵
  12. 余世伟视频笔记----如何塑造管理者的性格魅力领袖根性之积极和大度
  13. 无根树任意根深度加强版
  14. uniapp,vue学习笔记
  15. 无线局域网和蜂窝移动网络_手机连上WiFi之后,你会关闭移动网络吗?这其中大有讲究...
  16. 如何一步步打造完美的成绩查询系统平台?
  17. 性能测试指标及常用的监控工具
  18. 手机上传日志文件给服务器,手机内容远程上传到服务器
  19. 如何修改桌面的存放路径?(将桌面放到D盘或E盘)
  20. RxJava2 Flowable debounce(过滤操作符)去重复操作

热门文章

  1. 青少年CTF--misc部分题解
  2. http 各版本问题和优化
  3. Win10 虚拟桌面的使用
  4. Cloudera Manager拓展SPARK2-2.3.0.cloudera3-1.cdh5.6.0.p0.1-el6.parcel
  5. 群晖硬盘已损毁 Linux 修复,今天群晖存储空间损毁,起死回生
  6. 一篇难得的关于傅里叶分析的好文
  7. QueryList异步抓取网页数据
  8. DER 和 PEM 格式
  9. WINDOWS更改无线网卡MAC地址的方法
  10. 四天搞懂生成对抗网络(一)——通俗理解经典GAN