hdu 5616 Jam's balance 正反背包+转换
http://acm.hdu.edu.cn/showproblem.php?pid=5616
思路
题目中蕴含着两种需要计算的重量
1. 从所有的砝码中挑出任意种
2.(转换的思想)在天平的两端都挑出这些砝码中的一些,它也可以计算出差值,这个差值也是一种重量
这其实一种转换,看下面这个公式(左端砝码的重量)==(右端砝码的重量+能计算出的重量G)
当第一次选择一个砝码,我们计算出了以第二种方式的一种重量G,那么它也要被记为true,它还可以
继续更新出新的重量,G(新的左端砝码重量)=(右端砝码的重量+能计算出的重量)
那么上述的过程就是一个从背包里取出东西的过程。
在代码里有详细的分析。
背包正反各来一遍
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 2005
using namespace std;
int w[MAXN];
bool dp[MAXN];//滚动数组,只要一维,内存优化
int main()
{
int t,n,q,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = ;i<n;i++)
{
scanf("%d",&w[i]);
}
memset(dp,false,sizeof(dp));
dp[] = true;
//positive
//正着来一次背包,按阶段每一次添加一个
for(int i = ;i<n;i++)
{
//每一次选择当前这个砝码,j表示的是当前可以称出来的重量
//j-w[i]表示前一轮该重量是否有
for(int j = MAXN;j>=w[i];j--)
{
dp[j]|=dp[j-w[i]];
} //必须倒着来,如果正着来错误!!
/*
for(int j = 0;j<=MAXN-w[i];j++)
{
dp[j+w[i]]|=dp[j];
}
在这一次循环中用到了本轮已更新的结果,我们只能用前一轮的结果
这样会出现的错误是一轮中加了n个w[i],而且在本轮中加了n个,毫无疑问!
*/
} //negative
//逆着来一遍,从背包中取出东西
for(int i = ;i<n;i++)
{
//按照我的题解就是每一次选中当前的这个砝码作为右端砝码
//j表示左端减去右端的重量
//也许你要理解的是每一次你只选一个,这样的话要是右端放多个不也行吗
//但是你要知道你每一轮的新重量其实是保留下来了(更新了)
//所以下一轮中用了前一个砝码的新重量你还可以用(也就是再减一个砝码)
for(int j = ; j<=MAXN-w[i] ; j++)
{
dp[j]|=dp[j+w[i]];
} //必须正着来,如果倒着来也错误!!
/*
for(int j = MAXN-w[i];j>=0;j--)
{
dp[j-w[i]]|=dp[j];
}
在这一次循环中用到了本轮已更新的结果,我们只能用前一轮的结果
这样会出现的错误是一轮中减了n个w[i],而且在本轮中减了n个,毫无疑问!
*/
}
scanf("%d",&q);
for(int i = ;i<=q;i++)
{
scanf("%d",&k);
if(dp[k])
printf("YES\n");
else
printf("NO\n");
}
}
return ;
}
hdu 5616 Jam's balance 正反背包+转换的更多相关文章
- HDU 5616 Jam's balance(01背包)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...
- HDU 5616 Jam's balance(Jam的天平)
HDU 5616 Jam's balance(Jam的天平) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- HDU 5616 Jam's balance 背包DP
Jam's balance Problem Description Jim has a balance and N weights. (1≤N≤20)The balance can only tell ...
- HDU 5616 Jam's balance(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5616 题目: Jam's balance Time Limit: 2000/1000 MS (Java ...
- hdu 5616 Jam's balance(dp 正反01背包)
来自官方题解: AC代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream ...
- HDU 5616 Jam's balance
背包.dp[i]=1表示i这种差值能被组合出来,差值有负数,所以用sum表示0,0表示-sum,2*sum表示sum. 询问X的时候,只需看dp[sum+X]或者dp[sum-X]是否有一个为1,注意 ...
- HDU 5616:Jam's balance(背包DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5616 题意:有n个物品,每个重量为w[i],有一个天平,你可以把物品放在天平的左边或者右边,接下来m个询问,问是 ...
- HDU 5234 Happy birthday --- 三维01背包
HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...
- cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )
hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...
随机推荐
- You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
[root@localhost dreamstart]# composer installLoading composer repositories with package informationI ...
- 在Ubuntu安装go编译环境
在Ubuntu安装go编译环境 好记性不如烂笔头,所以趁热打铁记录下golang编译环境的安装过程. 首先下载一些依赖包: sudo apt-get install bison ed gawk gcc ...
- Django中日志管理
在settings中设置日志的相关信息,然后再逻辑代码区就可以保存相应的信息了 #简单设置: LOGGING = { 'version': 1, 'disable_existing_loggers': ...
- Yii2 提供可以用属性的方式去获取类的一个方法
刚开始用 Yii 的小朋友可能对下面的写法非常疑惑: public function actionIndex() { $user = User::find()->where(['name'=&g ...
- springboot5
1.改造购物车系统 1.1.创建购物车的Spring Boot工程 1.1.导入依赖 <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- 第一篇 先用socket模拟web服务器
一.用socket来模拟网站访问 socket为python2.7 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket def han ...
- linux通过脚本获取内存信息
1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...
- 机器学习相关知识整理系列之一:决策树算法原理及剪枝(ID3,C4.5,CART)
决策树是一种基本的分类与回归方法.分类决策树是一种描述对实例进行分类的树形结构,决策树由结点和有向边组成.结点由两种类型,内部结点表示一个特征或属性,叶结点表示一个类. 1. 基础知识 熵 在信息学和 ...
- Docker-端口映射与容器互联
在使用docker过程中,通常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间有能够互相访问到对方的服务除了通过网络访问外,Docker还提供了两个很方便的功能来满足服务访问的基本需求 ...
- POJ 3928 Ping pong(树状数组+两次)
题意:每个人都有一个独特的排名(数字大小)与独特的位置(从前往后一条线上),求满足排名在两者之间并且位置也在两者之间的三元组的个数 思路:单去枚举哪些数字在两者之间只能用O(n^3)时间太高,但是可以 ...