题目网址https://nanti.jisuanke.com/t/32227

题意:

给n个信(信封有长宽和数目),问在找最多k种信封类型的时候,最少浪费多少纸

思路:

看了看题解,深以为然,这个思路很巧妙,也许是我太菜,没细想。

我们首先二进制枚举计算出,每种状态下,这些信合用同一种信封时的浪费数目。

然后通过枚举子集,dp[ i ] [ j ] 代表 i 种信封,现在已经装了 j 集合的信封的最小浪费数。

很显然,对于每种ij    我们从j的子集种去获取最小值,那么就是枚举  j 的子集,然后从之前已经退出的 dp[i-1] [ prej ] 中获得最小答案。

具体实现看代码,感觉思路很清晰很巧妙。

状压果然优秀。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define ll long long
using namespace std;
const int maxn = (1<<15)+20;
ll dp[20][maxn];
int W[maxn],H[maxn];
ll Q[maxn],C[maxn],cost[maxn];
int w[maxn],h[maxn],q[maxn];
int main()
{int n,k;scanf("%d%d",&n,&k);for(int i=0; i<n; i++){scanf("%d%d%d",&w[i],&h[i],&q[i]);}for(int i=0; i<(1<<n); i++){for(int j=0; j<n; j++){if(i&(1<<j)){W[i] = max(W[i],w[j]);H[i] = max(H[i],h[j]);Q[i] +=q[j];C[i] +=((long long)w[j]*h[j]*q[j]);}}cost[i] = (long long)W[i]*H[i]*Q[i] - C[i];//  cout<<cost[i]<<" "<<W[i]<<" "<<C[i]<<endl;}const ll inf = 1e12*20;for(int i=0; i<=k;i++)for(int j=0; j<(1<<n); j++)dp[i][j] = inf;dp[0][0] = 0;for(int i=1; i<=k; i++)for(int j=0; j<(1<<n); j++){ll cnt = inf;for(int k=j; k>0; k = ((k-1)&j)){cnt = min(cnt,dp[i-1][j-k]+cost[k]);}
//        if(j==(1<<n)-1)
//            cout<<cnt<<endl;dp[i][j] = cnt;}ll ans = inf;int d = (1<<n)-1;for(int i=1; i<=k; i++)ans = min(ans,dp[i][d]);printf("%lld\n",ans);return 0;
}

Greetings!(枚举子集+dp)相关推荐

  1. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  2. CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  3. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  4. 二进制枚举子集 CS Maxor 或运算,DP(SOS)

    https://blog.csdn.net/noone0/article/details/78289517 目前没有题目链接. 题意:长度为n的序列a,选出两个元素,其或运算结果的最大值为多少,并求出 ...

  5. BZOJ 2560(子集DP+容斥原理)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 757  Solved: 497 [Submit][Status][Discuss ...

  6. bzoj2560串珠子(子集dp)

    铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci, ...

  7. 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)

    牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...

  8. 2021牛客暑期多校训练营5 G-Greater Integer, Better LCM(暴力+子集dp)

    G-Greater Integer, Better LCM 看到校大佬的代码就瞬间会做了. 当时和队友想的是,首先转化题意即找两个数x≥a,y≥b[lcm(a,b)=c]x\ge a,y\ge b[\ ...

  9. [枚举子集]leetcode1255:得分最高的单词集合(hard)

    题目: 题解: 思路:枚举子集 代码如下: class Solution {public:int maxScoreWords(vector<string>& words, vect ...

最新文章

  1. php 变更 obj,PHP: 不向后兼容的变更 - Manual
  2. debian 9系统安装配置iptables
  3. 华为,为什么让全世界都感到害怕?
  4. 杭电oj2072,2091字符串java实现
  5. c语言 char memcpy,在C中使用memcpy复制无符号字符数组
  6. Online Learning算法理论与实践
  7. 2014年中国新闻业年度观察报告
  8. Android驱动开发第三章随想
  9. linux经典命令-Web服务器管理
  10. android studio 可视化编程,Android Studio 可视化界面 (Design)和文本界面(Text)的切换...
  11. 人声分离攻破“鸡尾酒会”效应,将为语音识别带来哪些新可能?
  12. Saver类--变量的保存和恢复
  13. C#通过ToLower()方法将字符串转换成小写的代码
  14. flutter 斗音页面
  15. 备受全球瞩目的「USDT集体索赔案」来龙去脉|全文译本
  16. Ubuntu 8.04 LTS 安装
  17. 杜克大学计算机世界排名,国本美本多背景的他竟拿杜克大学保底!轻松收获21年CS录取!...
  18. oracle物料单位错误,Oracle EBS 销售时物料保留出错相关症状和处理方法
  19. 汇编语言跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
  20. 中国石油大学远程教育《应急救援概论》第三阶段在线作业

热门文章

  1. candence 安装好lite版怎么转标准版
  2. android 控件上下排列_android 实现控件左右或上下抖动教程
  3. Firefox拉黑中国
  4. 与运行其他家庭计算机共享打印机,家庭版WIN10启用GUEST连接共享打印机
  5. 论文学习:(TSN)Temporal segment networks: Towards good practices for deep action recognition
  6. Python新冠疫情可视化分析系统 计算机专业毕业设计源码08504
  7. java弹球游戏代码_Java实现简单的弹球游戏
  8. Hyperledger Fabric 自动发现网络信息 discover 工具使用
  9. (最小割)洛谷P4474 王者之剑
  10. 用python画雪花 科赫曲线递归_python 画雪花 —科赫曲线的实现-Python 实用宝典