果然对状压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)的更多相关文章

  1. BZOJ1688 「USACO05OPEN」Disease Manangement 背包+状压DP

    问题描述 BZOJ1688 题解 背包,在转移过程中使用状压. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; ...

  2. HDU 2923 Relocation(状压dp+01背包)

    题目代号:HDU2923 题目链接:http://poj.org/problem?id=2923 Relocation Time Limit: 1000MS Memory Limit: 65536K ...

  3. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  4. NOI 2015 寿司晚宴 (状压DP+分组背包)

    题目大意:两个人从2~n中随意取几个数(不取也算作一种方案),被一个人取过的数不能被另一个人再取.两个人合法的取法是,其中一个人取的任何数必须与另一个人取的每一个数都互质,求所有合法的方案数 (数据范 ...

  5. NOIP模拟 乘积 - 状压dp + 分组背包

    题目大意: 给出n和k,求从小于等于n的数中取出不超过k个,其乘积是无平方因子数的方案数.无平方因子数:不能被质数的平方整除. 题目分析: 10(枚举\(n\le8\)),40(简单状压\(n\le1 ...

  6. HDU - 6125: Free from square (状压DP+分组背包)

    problem:给定N,K.表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数.N,K<500: solution:显然可以状压DP做,但是500以内的素数还是 ...

  7. POJ 2923 Relocation(状压DP)题解

    题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...

  8. 【POJ 2923】Relocation(状压DP+DP)

    题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...

  9. 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时的最大总和. 然后简单维护一下转移就行了. 由于想皮一下果 ...

随机推荐

  1. Hive(转)

    Hive分区表 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念.分区表指的是在创建表时指 ...

  2. Javascript 5种方法实现过滤删除前后所有空格

    第一种:循环检查替换 //供使用者调用 function trim(s){ return trimRight(trimLeft(s)); } //去掉左边的空白 function trimLeft(s ...

  3. range([start], stop[, step]):产生一个序列,默认从0开始

    range([start], stop[, step]):产生一个序列,默认从0开始 >>> l = range(10) >>> l [0, 1, 2, 3, 4, ...

  4. 创建型-生成器模式(Builder)

    1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储 ...

  5. 如何解决eclipse中的中文乱码问题:

    方法一:代码里面进行改变编码 1. 编码方式的gbk和utf不同,不可以互相转换,只有byte和utf或者byte和gbk之间的转换,之间的转码如下:

  6. windows phone 中的TextBlock的一些特性(TextWrapping,TextWrapping)

    文字很长时,换行:TextWrapping="Wrap" 文字很长时,省略:TextWrapping="WordEllipsis"

  7. 驱动开发 - WDK 调试及 SVN 环境搭建

    由于从公司辞职了,所以以前在公司里搭建的驱动开发环境也就 Game Over 了, 同样由于那环境是很久以前搭建的,自己也有很多记不清楚的地方了, 而且其中还是有很多需要注意的地方的,所以在这里顺便做 ...

  8. Postman(API & HTTP请求调试插件)和Apizza fiddler

    http://blog.csdn.net/u011012932/article/details/51456263#comments

  9. 135. Candy

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

  10. Android 透明Button

    1.是制作9-patch的图片,这样能够匹配文字内容的长短. 2.是指定按钮样式背景,即定制drawable的xml文件,这样做的好处不用图片做背景,节省空间. 定制透明样式的按钮.直接看代码: dr ...