计蒜客习题:蒜头君的积木 (状压DP 枚举子集)
问题描述
蒜头君酷爱搭积木,他用积木搭了 n 辆重量为 wi的小车和一艘最大载重量为 W 的小船,他想用这艘小船将 n 辆小车运输过河。每次小船运载的小车重量不能超过 W。另外,小船在运载小车时,每辆小车会对小船有一个损坏值si,当多辆小车一起运载时,该趟运载对小船的损坏值为船上所有小车的最大损坏值。
现在蒜头君想知道,如何用小船运载 n 辆小车,可以使得对小船造成的总损坏值最小。
输入格式
第一行输入两个数 W 和 n(100≤w≤400,1≤n≤16),分别表示小船的最大载重量和小车总数。
接下来输入 n 行,每行输入两个整数si和 wi(1≤si ≤50,10≤wi≤100),分别表示每辆小车对小船的损坏值和每辆小车的重量。
输出格式 
输出一行,输出一个整数,表示用小船运载 nn 辆小车,最小的总损坏值。
样例输入
90 4
32 50
15 20
40 50
13 40
样例输出
72
问题分析
一眼可看出是状压dp,但是怎么枚举呢,可以利用枚举子集的方法,看当前状态是由哪个子集枚举而来的
枚举子集:
代码实现:
for(int S1=S;S1!=;S1=(S1-)&S){
    S2=S^S1;
其中S1
S1就是我们枚举得到的子集,S2是补集,为什么这么写可以看这一篇:
https://blog.csdn.net/yanzhenhuai/article/details/81572028S2=S
然后就是求解了,首先将一艘船的情况枚举出来就行:
#include <bits/stdc++.h> using namespace std;
int MAXN=0x3f3f3f3f;
int W,n,i,tot,j,s[],w[],dp[(<<)+];
int main()
{ cin>>W>>n;
for(i=;i<n;i++)
{
cin>>s[i]>>w[i];
}
tot=<<n;
memset(dp,MAXN,sizeof(dp));
for(i=;i<tot;i++)
{
int temp=;
int sw=;
for(j=;j<n;j++)
{
if((<<j)&i)
{
temp=max(temp,s[j]);
sw+=w[j];
}
}
if(sw>W)
continue;
else
dp[i]=temp;
}
for(i=;i<tot;i++)
{
for(j=i;j!=;j=(j-)&i)
{
dp[i]=min(dp[i],dp[j]+dp[j^i]);
}
}
cout<<dp[tot-]<<endl;
}
计蒜客习题:蒜头君的积木 (状压DP 枚举子集)的更多相关文章
- 计蒜客D2T2    蒜头君的排序(动态维护树状数组)
		
蒜头君的排序(sort) 2000ms 262144K 蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺 ...
 - 计蒜客 - A1633.蒜头君的数轴
		
我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...
 - 牛客练习赛49  B	筱玛爱阅读 (状压DP,子集生成)
		
链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...
 - 【计蒜客习题】 取石子游戏(gcd)
		
问题描述 蒜头君和花椰妹在玩一个游戏,他们在地上将 n 颗石子排成一排,编号为 1 到 n.开始时,蒜头君随机取出了 2 颗石子扔掉,假设蒜头君取出的 2 颗石子的编号为 a, b.游戏规则如下,蒜头 ...
 - 【计蒜客习题】两仪剑法(gcd)
		
两仪剑法是武当派武功的高级功夫,且必须 2 个人配合使用威力才大.同时该剑法招数变化太快.太多.设武当弟子甲招数变化周期为 n,武当弟子乙招数变化周期为 m,两弟子同时使用该剑法,当 2 人恰好同时达 ...
 - 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)
		
query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...
 - 51Nod1626 B君的梦境 状压dp 矩阵
		
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1626.html 题目传送门 - 51Nod1626 题意 题解 首先考虑形象的想象本题中的思维空间. ...
 - 牛客网 十二桥问题(状压DP)
		
https://ac.nowcoder.com/acm/contest/1104/B 注意到\(\text{K}\)只有\(12\),因此对起点与每个毕经边对应的点单源最短路,\(\text{DP}\ ...
 - 计蒜客的一道题dfs
		
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
 
随机推荐
- springboot中使用spring security,登录url就出现403错误
			
参考链接:https://segmentfault.com/q/1010000012743613 有两个controller,一个是所有用户可以访问的@RequestMapping("use ...
 - keras使用AutoEncoder对mnist数据降维
			
import keras import matplotlib.pyplot as plt from keras.datasets import mnist (x_train, _), (x_test, ...
 - Clone failed: Could not read from remote repository
			
问题: 使用idea下载项目代码时报错,内容如下: Clone failed: Could not read from remote repository 解决方案: 把 SSH切换成 HTTP重新c ...
 - vue-cli 3.x 修改dist路径和在本地查看方法
			
打包文件路径问题 需要在项目的根目录添加一个vue.config.js.在这个文件中,我们可以进行一些个性化定制. module.exports = { // 基本路径 baseUrl: './', ...
 - python 绘制五角星
			
code import turtle n = eval(input("请输入五角星的长度")) turtle.begin_fill() #开始填充颜色 i = : turtle.f ...
 - Java基础__Java中集合类
			
ArrayList:有序.可重复.线程不安全.内部使用数组进行存储 LinkedList:有序.可重复.线程不安全.内部使用引用进行存储[可以很方便的进行插入.删除数据] Vector:有序.可重复. ...
 - 预处理、const、static与sizeof-sizeof与strlen有哪些区别
			
1:它们的区别如下: (1)sizeof是操作符,strlen是函数. (2)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所 ...
 - golang的写文件测试
			
package main import ( "os" "strings" "time" "fmt" "strc ...
 - go 两个数组取并集
			
实际生产中,对不同数组取交集.并集.差集等场景很常用,下面来说下两个数组取差集 直接上代码: //两个集合取并集 package main import "fmt" //思想: / ...
 - JVM----Class类文件结构
			
JVM平台无关性 Java具有平台无关性,也就是任何操作系统都能运行Java代码.之所以能实现这一点,是因为Java运行在虚拟机之上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现“一次 ...