POJ2923--Relocation(01背包+状压dp)
果然对状压DP,我根本就不懂=。=
/**************************************************
Problem: 2923 User: G_lory
Memory: 720K Time: 157MS
Language: G++ Result: Accepted
**************************************************/
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std; const int MAXN = 1 << 11;
const int INF = 0x5f5f5f5f; int n, c1, c2;
int w[12];
int dp[MAXN];
int vis[MAXN];
int bag[MAXN]; bool ok(int st)
{
memset(vis, 0, sizeof vis);
vis[0] = 1;
int sum = 0;
for (int i = 0; i < n; ++i)
{
if ((1 << i) & st)//if (i & n)
{
sum += w[i];
if (sum > c1 + c2) return false;// 很好理解,如果比两个车装的物体和还大,不可能一次装完
for (int j = c1; j >= w[i]; --j)
{
if (vis[j - w[i]]) // 对n这个状态含有的物体做01背包,
vis[j] = 1; // vis[j]=1表示物体可以刚好组成j,且j可以c1被装下
}
}
} for (int i = 0; i <= c1; ++i) // 就是看sum能否被两车一次装下
if (sum - i <= c2 && vis[i]) return true;
return false;
} int main()
{
int t;
scanf("%d", &t);
for (int cas = 1; cas <= t; ++cas)
{
scanf("%d%d%d", &n, &c1, &c2); for (int i = 0; i < n; ++i)
{
scanf("%d", &w[i]);
} int st = (1 << n) - 1;
int cnt = 0; for (int i = 1; i <= st; ++i)
{
if (ok(i))
{
bag[cnt++] = i;
}
} for (int i = 1; i <= st; ++i) dp[i] = INF;
dp[0] = 0; for (int i = 0; i < cnt; ++i)
{
for (int j = st; j >= 0; --j)
{
if (dp[j] != INF && (j & bag[i]) == 0)
{
dp[j | bag[i]] = min(dp[j | bag[i]], dp[j] + 1);
}
}
} printf("Scenario #%d:\n%d\n\n", cas, dp[st]); }
return 0;
}
POJ2923--Relocation(01背包+状压dp)的更多相关文章
- BZOJ1688 「USACO05OPEN」Disease Manangement 背包+状压DP
问题描述 BZOJ1688 题解 背包,在转移过程中使用状压. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; ...
- HDU 2923 Relocation(状压dp+01背包)
题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- NOI 2015 寿司晚宴 (状压DP+分组背包)
题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...
- NOIP模拟 乘积 - 状压dp + 分组背包
题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...
- HDU - 6125: Free from square (状压DP+分组背包)
problem:给定N,K.表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数.N,K<500: solution:显然可以状压DP做,但是500以内的素数还是 ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- 【POJ 2923】Relocation(状压DP+DP)
题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...
- 2018.10.01 NOIP模拟 偷书(状压dp)
传送门 状压dp经典题. 令f[i][j]f[i][j]f[i][j]表示到第i个,第i−k+1i-k+1i−k+1~iii个物品的状态是j时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果 ...
随机推荐
- Java学习--Equals与“==”
在Java规范中,它对equals()方法的使用必须要遵循如下几个规则: equals 方法在非空对象引用上实现相等关系: 1.自反性:对于任何非空引用值 x,x.equals(x) 都应返回 tru ...
- protues仿真 51点亮点阵
电路图 程序 /*============================== 点亮点阵心形 ================================*/ #include <REGX5 ...
- iOSApp -Monkey测试
IOS操作系统不像Android系统那么方便,各种限制也比较多,目前我的建议还是直接在模拟器上执行monkey测试.如果需要在真机上面执行,可以参考文档: http://testerhome.com/ ...
- Wix 安装部署(一)同MSBuild 自动生成打包文件 转
原文地址:http://www.cnblogs.com/stoneniqiu/p/3355086.html 因为项目需要,最近在研究Wix打包部署,园子里也有一些关于wix的博客,方方面面,讲的点各不 ...
- Automotive Security的一些资料和心得(2):Cryptography
1. Security Goal - Confidentiality - Integrity - Availability - Authenticity - Non-repudiation - Aut ...
- H5动画优化之路
H5动画60fps之路 在移动端,和Native相比,H5一直都被人吐槽性能差,尤其是在动画方面. 谈到整个Web app的生命周期,一般分为四个部分: 加载 等待用户 响应用户 动画 一般情况下,首 ...
- 更改nginx网站根目录
默认网站根目录为/usr/local/nginx/html,要将它改成/homw/www vi /usr/local/nginx/conf/nginx.conf 将其中的 loca ...
- How to Run Node.js with Express on Mobile Devices
We released a JXcore plugin for Apache Cordova recently and in this article I will show how to run a ...
- 介绍一个超好用的HICHARTS扩展插件
因为需要,所以HIGHCHARTS了解一下是很有必要的. 但原始应用确实效率不行. 刚好,现在有个需求是从一系列的JSON里抽出表格数据,再显示图形. jquery.highchartsTable.j ...
- show processlist 执行状态分析
Sleep状态 通常代表资源未释放,如果是通过连接池,sleep状态应该恒定在一定数量范围内 实战范例:因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产生大量slee ...