Greetings!(枚举子集+dp)
题目网址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)相关推荐
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...
- CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)
柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- 二进制枚举子集 CS Maxor 或运算,DP(SOS)
https://blog.csdn.net/noone0/article/details/78289517 目前没有题目链接. 题意:长度为n的序列a,选出两个元素,其或运算结果的最大值为多少,并求出 ...
- BZOJ 2560(子集DP+容斥原理)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 757 Solved: 497 [Submit][Status][Discuss ...
- bzoj2560串珠子(子集dp)
铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci, ...
- 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)
牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...
- 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[\ ...
- [枚举子集]leetcode1255:得分最高的单词集合(hard)
题目: 题解: 思路:枚举子集 代码如下: class Solution {public:int maxScoreWords(vector<string>& words, vect ...
最新文章
- php 变更 obj,PHP: 不向后兼容的变更 - Manual
- debian 9系统安装配置iptables
- 华为,为什么让全世界都感到害怕?
- 杭电oj2072,2091字符串java实现
- c语言 char memcpy,在C中使用memcpy复制无符号字符数组
- Online Learning算法理论与实践
- 2014年中国新闻业年度观察报告
- Android驱动开发第三章随想
- linux经典命令-Web服务器管理
- android studio 可视化编程,Android Studio 可视化界面 (Design)和文本界面(Text)的切换...
- 人声分离攻破“鸡尾酒会”效应,将为语音识别带来哪些新可能?
- Saver类--变量的保存和恢复
- C#通过ToLower()方法将字符串转换成小写的代码
- flutter 斗音页面
- 备受全球瞩目的「USDT集体索赔案」来龙去脉|全文译本
- Ubuntu 8.04 LTS 安装
- 杜克大学计算机世界排名,国本美本多背景的他竟拿杜克大学保底!轻松收获21年CS录取!...
- oracle物料单位错误,Oracle EBS 销售时物料保留出错相关症状和处理方法
- 汇编语言跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
- 中国石油大学远程教育《应急救援概论》第三阶段在线作业
热门文章
- candence 安装好lite版怎么转标准版
- android 控件上下排列_android 实现控件左右或上下抖动教程
- Firefox拉黑中国
- 与运行其他家庭计算机共享打印机,家庭版WIN10启用GUEST连接共享打印机
- 论文学习:(TSN)Temporal segment networks: Towards good practices for deep action recognition
- Python新冠疫情可视化分析系统 计算机专业毕业设计源码08504
- java弹球游戏代码_Java实现简单的弹球游戏
- Hyperledger Fabric 自动发现网络信息 discover 工具使用
- (最小割)洛谷P4474 王者之剑
- 用python画雪花 科赫曲线递归_python 画雪花 —科赫曲线的实现-Python 实用宝典