C - Greetings!

题目链接

题目大意

给n种信,每种信wi,hi,pi 分别代表长、宽、数量。
让选择k种信封来装这些信,每个信封里装一个。
如果把w,h的信装到了x,y的信封里,那么造成的浪费为x * y - w * h;
问装完这些最小造成多少浪费
n,k <= 15

题解

dp数组:
dp[i][j] 表示用i种信封装集合为j的信造成的浪费最小是多少。
j怎么表示一个集合? 状压。
主要是想不到怎么表示dp数组。害~
想到这里就变得很简单了。
先预处理出每种集合的浪费数量s:

 for (int  i= 0; i < (1 << n); i ++ ){ll ww = 0;ll hh = 0;ll num = 0;ll temp = 0;for (int j = 1; j <= n; j ++ ){if(i & (1 << (j - 1))){ww = max(ww,w[j]);hh = max(hh,h[j]);num += p[j];temp += w[j] * h[j] * p[j];}}s[i] = ww * hh * num - temp;}

状态转移:
枚举k,然后枚举表示的集合,再枚举集合的子集,(当前这个集合从子集转移过来,)然后对这些取最小值。

 dp[0][0] = 0;for (int  i= 1; i <= k; i ++ ){for (int j = 0; j < (1 << n); j ++ ){for (int k = j; k > 0; k = (k - 1) & j){if(dp[i - 1][j - k] != -1){if(dp[i][j] == -1)dp[i][j] = dp[i - 1][j - k] + s[k];elsedp[i][j] = min(dp[i][j],dp[ i- 1][j - k] + s[k]);// printf("%d %lld\n",k,s[k]);}}// printf("%d %d %lld\n",i,j,dp[i][j]);}}
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <cmath>
#include <set>
#include <cstring>
#include <string>
#include <bitset>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define st first
#define sd second
#define mkp make_pair
#define pb push_back
ll gcd(ll a,ll b){return b == 0 ? a : gcd(b,a % b);}
ll qpow(ll a,ll b,ll mod){ll ans  = 1;while(b){if(b & 1)ans = ans * a % mod;a = a * a % mod;b >>= 1;}return ans;}
struct cmp{bool operator()(const pii & a, const pii & b){return a.second > b.second;}};const int inf = 0x3f3f3f3f;const int maxn = 1e5+5;
const int M = 20;
ll w[M];
ll h[M];
ll p[M];
ll dp[M][maxn];
ll s[maxn];
int main()
{int n,k;scanf("%d%d",&n,&k);for (int i = 1; i <= n; i++ ){scanf("%lld%lld%d",&w[i],&h[i],&p[i]);}for (int  i= 0; i < (1 << n); i ++ ){ll ww = 0;ll hh = 0;ll num = 0;ll temp = 0;for (int j = 1; j <= n; j ++ ){if(i & (1 << (j - 1))){ww = max(ww,w[j]);hh = max(hh,h[j]);num += p[j];temp += w[j] * h[j] * p[j];}}s[i] = ww * hh * num - temp;}for (int  i= 0; i <= n; i ++ ){for (int j = 0; j < (1 << n);  j++ )dp[i][j] = -1;}// printf("1\n");dp[0][0] = 0;for (int  i= 1; i <= k; i ++ ){for (int j = 0; j < (1 << n); j ++ ){for (int k = j; k > 0; k = (k - 1) & j){if(dp[i - 1][j - k] != -1){if(dp[i][j] == -1)dp[i][j] = dp[i - 1][j - k] + s[k];elsedp[i][j] = min(dp[i][j],dp[ i- 1][j - k] + s[k]);// printf("%d %lld\n",k,s[k]);}}// printf("%d %d %lld\n",i,j,dp[i][j]);}}ll ans = -1;for (int  i= 1; i <= k; i ++ ){if(ans == -1)ans = dp[i][(1 << n) - 1];elseans = min(dp[i][(1 << n) - 1],ans);}printf("%lld\n",ans);
}

湖南多校补题 状压dp相关推荐

  1. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  2. [状压dp] 蒙德里安的梦想(模板题+状压dp)

    文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...

  3. [状压dp] 最短Hamilton路径(模板题+状压dp)

    文章目录 0. 前言 1. 状压dp 模板题 0. 前言 状压 dp 就是采用二进制数保存状态,方便进行位运算操作.例如 八皇后.八数码问题也都是采用了状态压缩的思想来使用一个二进制数唯一对应集合中的 ...

  4. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐搭积木(状压dp)

    题干: 小乐乐想要给自己搭建一个积木城堡. 积木城堡我们假设为n*m的平面矩形. 小乐乐现在手里有1*2,2*1两种地砖. 小乐乐想知道自己有多少种组合方案. 输入描述: 第一行输入整数n,m.(1& ...

  5. [状压dp] 小国王(状压dp+下标映射技巧)

    文章目录 0. 前言 1. 状压dp+棋盘式(基于连通性) 0. 前言 相关: [状压dp] 蒙德里安的梦想(模板题+状压dp) 1. 状压dp+棋盘式(基于连通性) 1064. 小国王 思路: 状压 ...

  6. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  7. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  8. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  9. Orz_panda cup I题 (xdoj1117) 状压dp

    Orz_panda cup I题 (xdoj1117)  状压dp 1117: Insert Orz Pandas 时间限制: 2 Sec  内存限制: 128 MB 提交: 15  解决: 5 [提 ...

最新文章

  1. Windows——双系统环境下没有启动Windows 启动管理器(自动跳过操作系统选择界面)解决方案
  2. mysql5.6安装sys库_MySQL5.6数据库优化my.cnf配置
  3. 判断能被N整除的字符串
  4. linux 文档编辑器 word,linux下vi编辑器命令大全
  5. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
  6. Java 语言 ArrayList 和 JSONArray 相互转换
  7. python编程从入门到实践第八章_Python编程从入门到实践的第三天
  8. Java OCR tesseract 图像智能字符识别技术 Java实现
  9. Tomcat 7 证书配置中遇到的一个问题
  10. python round()函数保留小数位数的详细用法及round函数的坑
  11. pdf里面的图片如何提取出来?
  12. 上传图片时出现http 415错误
  13. 百度竞价开户优化的细节到底是哪些
  14. 十大著名黑客——李纳斯-托瓦兹
  15. 【产业互联网周报】阿里将暂停阿里云美国扩张计划;协同办公领域硝烟又起,华为推WeLink,企业微信与微信打通;申通全面迁至阿里云...
  16. VS2015远程调试
  17. 下载yahoo股票历史数据
  18. stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)
  19. CSDN日报190716:忆贵州三年的教书编程岁月:不弛于空想,不骛于虚声
  20. 精心挑选10款基于 jQuery 的图片360度旋转插件

热门文章

  1. 基于mappwidget的手绘地图
  2. Oracle 11g下载以及与plsql的连接
  3. 第一台计算机有用到网络吗,怎么通过一台有网的电脑将另一台没网的电脑连接上网...
  4. 元学习之《Matching Networks for One Shot Learning》代码解读
  5. Java swing坦克大战,我女儿都学会了,你呢?
  6. replace和regexp_replace替换字符串
  7. 关于Android 模拟器复制粘贴及中文输入的问题
  8. 程序员的“老年歧视”
  9. JSP 用JS弹出确认删除对话框
  10. 哈哈日语 | 超实用商务日语问题