这题的题意是 在双脚天平上有N块东西,依次从上面取走一些,最后使得这个天平保持平衡!

解题:

  逆着来依次放入,如果可行那就可以,记得得有木板自身的重量。

/*************************************************************************
> File Name: 10123.cpp
> Author: opas
> Mail: 1017370773@qq.com
> Created Time: 2016年10月22日 星期六 22时58分53秒
************************************************************************/
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxm = ;
const int maxn = <<maxm;
struct Node {
int id,weight,dist;
Node (int l_id = , int l_weight = , int l_dist = ) {
id = l_id;
weight = l_weight;
dist = l_dist;
}
bool operator < (const Node A)const {
if (weight != A.weight ) return weight < A.weight;
return id < A.id;
}
}package[maxm];
int dp[maxn];
int weight_val[maxn][];
int ans[maxm];
void InitVal(int n) {
int max_val = <<n;
for(int i = ; i < max_val; ++ i) {
dp[i] = ;
}
}
int length ,weight, num_package;
void AddPackage(int per_status ,int now_status, int id) {
for ( int i = ; i < ; ++ i)
weight_val[now_status][i] = weight_val[per_status][i];
if(package[id].dist <= -) {
weight_val[now_status][] = weight_val[per_status][] + - ( package[id].dist + ) * package[id].weight;
weight_val[now_status][] = weight_val[per_status][] + - ( package[id].dist - ) * package[id].weight;
}else if(package[id].dist < ){
weight_val[now_status][] = weight_val[per_status][] + (package[id].dist + ) * package[id].weight;
weight_val[now_status][] = weight_val[per_status][] + - (package[id].dist - ) * package[id].weight;
}else{
weight_val[now_status][] = weight_val[per_status][] + (package[id].dist + )*package[id].weight;
weight_val[now_status][] = weight_val[per_status][] + (package[id].dist - )*package[id].weight;
}
}
int CheckPackage(int now_status) {
int l_val1 = weight_val[now_status][];
int l_val2 = weight_val[now_status][] + * weight;
if(l_val1 > l_val2){
return dp[now_status] = ;
}
l_val1 = weight_val[now_status][];
l_val2 = weight_val[now_status][] + * weight;
if(l_val1 > l_val2) {
return dp[now_status] = ;
}
return dp[now_status] = ;
}
int dfs(int now_loc, int now_status) {
if(now_loc == num_package) {
return ;
}
dp[now_status] = ;
for(int i = ; i< num_package ; ++ i) {
if(now_status & (<<i))
continue;
int next_status = now_status | (<<i);
if(dp[next_status] == ) return dp[next_status];
AddPackage(now_status, next_status, i);
if(CheckPackage(next_status) == )
continue;
ans[now_loc] = i;
if (dfs(now_loc+, next_status) == ) {
return dp[now_status]=;
}
}
return ;
}
int main(){
for(int cc = ; ; ++ cc) {
cin>>length>>weight>>num_package;
if(length + weight + num_package == )
break;
InitVal(num_package);
for(int i = ; i < num_package; ++ i) {
int l_weight , l_dist;
scanf("%d%d",&l_dist, &l_weight);
l_dist = l_dist * ;
package[i] = Node(i, l_weight, l_dist);
}
printf("Case %d:\n",cc);
if( dfs( , ) == ) {
for(int i = num_package - ; i >= ; -- i) {
printf("%d %d\n", package[ans[i]].dist/, package[ans[i]].weight);
}
}else{
printf("Impossible\n");
}
}
return ;
}

uva 10123 - No Tipping dp 记忆化搜索的更多相关文章

  1. UVa 10599【lis dp,记忆化搜索】

    UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...

  2. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions

    题意: 有n个长为m的各不相同的二进制数(允许存在前导0),别人已经事先想好n个数中的一个数W,你要猜出这个数. 每次只可以询问该数的第K为是否为1. 问采用最优询问策略,则最少需要询问多少次能保证猜 ...

  3. UVa 10817 (状压DP + 记忆化搜索) Headmaster's Headache

    题意: 一共有s(s ≤ 8)门课程,有m个在职教师,n个求职教师. 每个教师有各自的工资要求,还有他能教授的课程,可以是一门或者多门. 要求在职教师不能辞退,问如何录用应聘者,才能使得每门课只少有两 ...

  4. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  5. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  6. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  7. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  8. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  9. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

随机推荐

  1. 我的 FPGA 学习历程(05)—— 使用 Modelsim 仿真工具

    在第 3 篇中讲到了如何使用图形进行仿真激励输入,图形输入法尽管简单易学,但如若要求复杂的仿真输入激励.较长的仿真时间或是要求打印输出信息乃至输出文件日志则显得不够用了. 本篇以上一篇的 3-8 译码 ...

  2. react_app 项目开发 (8)_角色管理_用户管理----权限管理 ---- shouldComponentUpdate

    角色管理 性能优化(前端面试) 需求:只要执行 setState(), 就会调用 render  重新渲染.由于有时调用了 setState,但是并没有发生状态的改变,以致于不必要的刷新 解决: 重写 ...

  3. NIOS_UART

    1.Fifoed avalon UART带缓冲区,使用非常方便,google下载,google上有的技术资料,百度上找不到,以为没有这个事情: 2.两种UART如果想用操作寄存器的方式操作,需要在al ...

  4. js表单提交到后台对象接收

    $.extend({ StandardPost:function(url,args){ var form = $("<form method='post' target='_blank ...

  5. 配置Mqtt

    一.java后台调用MQTT 准备工作:需要导入的jar包 <!-- mqtt依赖包--> <dependency> <groupId>org.fusesource ...

  6. js 重写alert 兼容iphone使得alert 不带src

    <script> window.alert = function(name){ var iframe = document.createElement("IFRAME" ...

  7. net-tools与iproute2

    net-tools与iproute2 我们知道redhat系列发行版7x版本中最小化安装是没有net-tools工具包的,默认使用iproute2工具包,最直观的感受是ifconfig命令被ip命令所 ...

  8. Android系统裁剪:手把手教你如何进行系统裁剪

    前言:android系统裁剪优化一直是各个厂商定制产品的关键步骤,包括浅层次的去除不必要的apk(android apk裁剪定制 )和深层次的裁剪整个编译系统和框架层.   android作为开源系统 ...

  9. 2017(2)数据库设计,数据库设计过程,ER模型,规范化理论

    试题二(共 25 分〉 阅读以下关于系统数据分析与建模的叙述,在答题纸上回答问题1 至问题 3. [说明] 某软件公司受快递公司委托,拟开发一套快递业务综合管理系统,实现快递单和物流信息的综合管理.项 ...

  10. 2018(5)软件架构设计,架构风格,REST

    2018上半年系统分析师试题五 阅读以下关于Web应用设计开发的描述,在答题纸上回答问题1至问题3. [说明] 某公司拟开发一个自由,可定制性强.用户界面友好的在线调查系统,以获取员工在课程学习.对公 ...