题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数。
好像不是很好想,我看了网上的题解才做出来。
先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的,如果小于c2,那么可以一次运送i状态里的货物。
然后再用DP把s【i】为i状态的运送次数,通过转移方程s[i | j] = min{s[i | j] ,s[i] + s[j]}计算出全部运送过去的最少次数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 11
#define M 102
#define U (1<<n)
using namespace std;
int t, n, c1, c2, w[N];
int s[ << N],cnt; void solve()
{
int dp[N * M], sum;
for(int i = ; i < U; i++)
{
memset(dp, , sizeof dp);
dp[] = ;
sum = ;
for (int j = ; j < n; j++)
{
int x = << j;
if (x & i)//i状态里有第j个货物
{
sum += w[j];//一边累加该状态的总重量
for (int k = c1 - w[j]; k >= ; k--)
{
if (dp[k])//c1装k重量行不行
dp[k + w[j]] = ;
}
}
} for(int k = ; k <= sum; k++)
if (dp[k] && sum - k <= c2)
{
s[i] = ;//i状态需要一次车程运送过去。
break;
}
}
} int dp()
{
for (int i = ; i < U; i++)
if (s[i])
for (int j = ; j < U - i; j++)
if ((j & i) == && s[j]) //i状态和j状态都是可以运送过去的,且i和j没有重合的货物
if (s[i | j] == || s[i | j] > s[i] + s[j])//i+j状态原来不能运送过去,或者原来运送过去的次数更大
s[i | j] = s[i] + s[j];//更新
return s[U - ];
} int main()
{
scanf("%d", &t);
for(int sc = ; sc <= t; sc++)
{
memset(s, , sizeof s);
scanf("%d%d%d", &n, &c1, &c2);
for(int i = ; i < n; i++) scanf("%d", &w[i]);
solve();
printf("Scenario #%d:\n%d\n\n", sc, dp());
}
return ;
}

  

【POJ 2923】Relocation(状压DP+DP)的更多相关文章

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

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

  2. POJ 2923 Relocation 装车问题 【状态压缩DP】+【01背包】

    题目链接:https://vjudge.net/contest/103424#problem/I 转载于:>>>大牛博客 题目大意: 有 n 个货物,并且知道了每个货物的重量,每次用 ...

  3. POJ 3254 & POJ 1185(状压DP入门)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16773   Accepted: 8860 Desc ...

  4. POJ 3254 简单状压DP

    没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...

  5. POJ 2923 Relocation(01背包变形, 状态压缩DP)

    Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...

  6. 【10.26校内测试】【状压?DP】【最小生成树?搜索?】

    Solution 据说正解DP30行??? 然后写了100行的状压DP?? 疯狂特判,一算极限时间复杂度过不了aaa!! 然而还是过了....QAQ 所以我定的状态是待转移的位置的前三位,用6位二进制 ...

  7. 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)

    点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...

  8. HDU - 4804 Campus Design(状压+轮廓线dp)

    Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...

  9. $POJ2411\ Mondriaan's\ Dream$ 状压+轮廓线$dp$

    传送门 Sol 首先状压大概是很容易想到的 一般的做法大概就是枚举每种状态然后判断转移 但是这里其实可以轮廓线dp 也就是从上到下,从左到右地放方块 假设我们现在已经放到了$(i,j)$这个位置 那么 ...

  10. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

随机推荐

  1. Django项目中model增加了新字段怎样更新?

    Django是不直接支持syncdb更新数据库的字段的,必须重新建立. 或者改一个表名新建一个表... 刚刚想出来一招: 自己在表上面先加一个字段,然后再在model上面改,貌似是可以的.

  2. sqlzoo.net刷题3

    Find the continents where all countries have a population <= 25000000. Then find the names of the ...

  3. isAnimated函数

    function isAnimated($obj){ var flag=false; if($obj.is(":animated")){ flag=true; } return f ...

  4. PHP 运行方式(PHP SAPI介绍)

    SAPI:Server Application Programming Interface 服务器端应用编程端口.它就是PHP与其它应用交互的接口,PHP脚本要执行有很多种方式,通过Web服务器,或者 ...

  5. 【转】MySQL 性能优化的最佳20多条经验分享

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.   当我们去设计数据库表结构,对操 ...

  6. JayProxy的设置

    1. mac http://pac.jayproxy.com/jayproxy/jayproxy.pac 2. wifi http://pac.jayproxy.com/jayproxy/m.pac ...

  7. webpack+react+redux+es6

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  8. Asp.net MVC十问十答[译]

    1. Explain MVC (Model-View-Controller) in general? MVC (Model-View-Controller) is an architectural s ...

  9. python机器学习《回归 一》

    唠嗑唠嗑 依旧是每一次随便讲两句生活小事.表示最近有点懒,可能是快要考试的原因,外加这两天都有笔试和各种面试,让心情变得没那么安静的敲代码,没那么安静的学习算法.搞得第一次和技术总监聊天的时候都不太懂 ...

  10. Jenkins进阶系列之——04Publish Over FTP Plugin插件

    说明:这个插件可以将构建的产物(例如:Jar)发布到FTP中去. 官方说明:Publish Over FTP Plugin 安装步骤: 系统管理→管理插件→可选插件→Artifact Uploader ...