这题的题意是 在双脚天平上有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. mongodb 遇到问题-查询单个需要包装id

    mongodb,get字符查询需要传入特定的包装id才能识别 const ObjectID = require('mongodb').ObjectID exports.queryOne = (req, ...

  2. vue2.0无限滚动加载数据插件

      做vue项目用到下拉滚动加载数据功能,由于选的UI库(element)没有这个组件,就用Vue-infinite-loading 这个插件代替,使用中遇到的一些问题及使用方法,总结作记录! 安装: ...

  3. jQuery (02) 重点知识点总结

    jQuery 如果用户未登录,当加入购物车,会将商品相关信息存入 cookie 或者 session,这两个都是可以标识用户信息的东西 是一个 JavaScript 库,封装了常用的开发功能,和一些需 ...

  4. 【搜索2】P1706 全排列问题

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...

  5. Python全栈-magedu-2018-笔记5

    第三章 - Python 内置数据结构 字符串 一个个字符组成的有序的序列,是字符的集合. python中一个字符也是str类型. 使用单引号.双引号.三引号引住的字符序列 字符串是不可变对象 Pyt ...

  6. js 中数组的遍历

    var x = ['a','b','c'] x.forEach(function(val,k){ console.log(val + '--' +k); }) a--0 b-- 1 c-- 2 var ...

  7. ide phpStorm 配置PHP路径并本地执行PHP脚本

    1.打开设置(File - Settings) 2. 3. 4.到需要执行脚本的文件处,右击 - Run 5.如果本地还未安装PHP,可以下载Xampp,并将PHP目录新增至系统环境变量Path处,重 ...

  8. shell 爬取图片下载到本地

    #!/bin/bash #ddmm // #if [ -z $string ] 如果string 为空 #-z STRING the length of STRING is zero read -p ...

  9. ItunesConnect:"Missing Push Notification Entitlement"警告-----以及解决方法

    最近开发的cordova应用,要做ios的适配,并且发布版本,但是有一次在发测试版本的时候,突然收到一封邮件警告,原文如下: Missing Push Notification Entitlement ...

  10. LG3369 普通平衡树

    题意 维护一些数,其中需要提供以下操作: 1.插入\(x\) 2.删除\(x\)(若有多个相同的数,只删除一个) 3.查询\(x\)的排名(排名定义为比当前数小的数的个数\(+1\)) 4.查询排名为 ...