zoj 3706 Break Standard Weight(dp)
Break Standard Weight
Time Limit: 2 Seconds Memory Limit: 65536 KB
The balance was the first mass measuring instrument invented. In its traditional form, it consists of a pivoted horizontal lever of equal length arms, called the beam, with a weighing pan, also called scale, suspended from each arm (which is the origin of the originally plural term "scales" for a weighing instrument). The unknown mass is placed in one pan, and standard masses are added to this or the other pan until the beam is as close to equilibrium as possible. The standard weights used with balances are usually labeled in mass units, which are positive integers.
With some standard weights, we can measure several special masses object exactly, whose weight are also positive integers in mass units. For example, with two standard weights 1 and 5, we can measure the object with mass 1, 4, 5 or 6 exactly.
In the beginning of this problem, there are 2 standard weights, which masses are x and y. You have to choose a standard weight to break it into 2 parts, whose weights are also positive integers in mass units. We assume that there is no mass lost. For example, the origin standard weights are 4 and 9, if you break the second one into 4 and 5, you could measure 7 special masses, which are 1, 3, 4, 5, 8, 9, 13. While if you break the first one into 1 and 3, you could measure 13 special masses, which are 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13! Your task is to find out the maximum number of possible special masses.
Input
There are multiple test cases. The first line of input is an integer T < 500 indicating the number of test cases. Each test case contains 2 integers x and y. 2 ≤ x, y ≤ 100
Output
For each test case, output the maximum number of possible special masses.
Sample Input
2
4 9
10 10
Sample Output
13
9
Author: YU, Zhi Contest: The 10th Zhejiang Provincial Collegiate Programming Contest
题意:两个砝码,将其中一个拆分后,得到三个数字,问这三个数字通过加减能组合成多少个数字
思路:1、首先是得到这三个数,怎么得到呢?假设两个砝码为x,y,可以分别把x、y进行分解,分解成两部分,可以x/2,y/2来枚举,并且要从小到大排序 然后标记,以免重复计算
2、然后是进行计算个数。dp[i][j]表示在第i个数时,j是否可以通过三个数字组合而成,dp[i][j]=1表示可以组合成j这个数字
3、然后枚举sum,for(int j=sum;j>=1;j--)进行判断,如果j>=当前的数字tmp,那么if(dp[i-1][j-tmp]==1)(j-tmp表示可以组成),能组成j-tmp的话,那么加上tmp也是可以的,所以dp[i][j]=1;
如果dp[i-1][j]==1,即能组成j的话,那么dp[i][j-tmp]=1,即j-w也是可以组成的
如果j<tmp,那么当 dp[i-1][j]=1 ,即j能组成的话,dp[i-1][tmp-j]=1 即j-w也能组成
然后统计所以得情况即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define N 106
int vis[N][N][N];
int m[];
int ans;
int dp[][N<<];
int sum;
bool cmp(int a,int b)
{
return a>b;
}
void solve()
{
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<=;i++)
{
int tmp=m[i];
memcpy(dp[i],dp[i-],sizeof(dp[]));
for(int j=sum;j>=;j--)
{
if(j>=tmp)
{
if(dp[i-][j-tmp])
dp[i][j]=;
if(dp[i-][j])
dp[i][j-tmp]=;
}
else
{
if(dp[i-][j])
dp[i-][tmp-j]=;
}
}
}
int cnt=;
for(int i=;i<=sum;i++)
if(dp[][i]==)
cnt++;
if(ans<cnt)
ans=cnt;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x,y;
sum=;
scanf("%d%d",&x,&y);
sum=x+y;
ans=;
memset(vis,,sizeof(vis));
m[]=;
for(int i=;i<=x/;i++)
{
m[]=i;
m[]=x-i;
m[]=y;
sort(m,m++,cmp);
if(!vis[m[]][m[]][m[]])
{
vis[m[]][m[]][m[]]=;
solve();
} }
for(int i=;i<=y/;i++)
{
m[]=i;
m[]=y-i;
m[]=x;
sort(m,m++,cmp);
if(!vis[m[]][m[]][m[]])
{
vis[m[]][m[]][m[]]=;
solve();
}
}
printf("%d\n",ans);
}
return ;
}
zoj 3706 Break Standard Weight(dp)的更多相关文章
- [ACM_水题] ZOJ 3706 [Break Standard Weight 砝码拆分,可称质量种类,暴力]
The balance was the first mass measuring instrument invented. In its traditional form, it consists o ...
- zoj 3706 Break Standard Weight
/*题意:将两个砝码中的其中一个分成两块,三块组合最多有几种情况(可以只有一块,或者两块). 组合情况 i j m 三块砝码 (i+j)-m=m-(i+j) i+j i-j=j-i i j m (i ...
- ZOJ 3706 Break Standard Weight 解题报告
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题目意思:给出两个mass:x 和 y,问如何将其中一个 ma ...
- Break Standard Weight (ZOJ 3706)
Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...
- ZOJ - 3450 Doraemon's Railgun (dp)
https://vjudge.net/problem/ZOJ-3450 题意 一座位落(X0,Y0)的城市将遭受n个敌人的摧残.现在我们手上有某科学的超电磁炮,每次攻击都是一条射线,对于共线的敌人,必 ...
- ZOJ 3791 An Easy Game(DP)
题目链接 题意 : 给你两个长度为N的字符串,将第一个字符串每次只能变化M个,问变换K次之后变成第二个字符串一共有几种方法. 思路 : DP.dp[i][j]表示变了 i 次之后有j个不一样的字母的方 ...
- ZOJ 1642 Match for Bonus (DP)
题目链接 题意 : 给你两个字符串,两个字符串都有共同的字母,给你每个字母的值,规则是,找出两个字符串中的共同的一个字母,然后这个字母的值就可以加到自己的分数上,但是这步操作之后,这两个字母及其之前的 ...
- ZOJ 3605 Find the Marble(dp)
Find the Marble Time Limit: 2 Seconds Memory Limit: 65536 KB Alice and Bob are playing a game. ...
- [ZOJ 3076] Break Standard Weight
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题意:给你两个数字,可以把其中一个拆成两个数字,计算这三个数字 ...
随机推荐
- iOS 压缩与裁剪图片问题
我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好. 这时你可能想到设置UIImageView ...
- hdu 4848 搜索+剪枝 2014西安邀请赛
http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,事实上不难.... 可是说实话,如今对题意还是理解不太好...... 犯的错误 ...
- SOA——面向服务的体系架构
上一篇博文中提到了"紧耦合"的现象.怎样解决?SOA.採用面向服务的体系架构. 一.What? SOA=Service-oriented Architecture面向服务的体系结构 ...
- Mysql数据库的mysql Schema 究竟有哪些东西& 手工注入的基础要领
#查看数据库版本号 mysql> select @@version; +------------+ | @@version | +------------+ | 5.5.16-log | +- ...
- Android设置里面默认存储器选项(default write disk)的实现
原生的Android设置里面没有默认存储器的选项,可是MTK偏偏加上了这个功能,可能MTK认为这个比較实用吧,所以,他们在原生的基础上面做了改动.加上了这个功能.可是高通平台没有这个功能.相对MTK来 ...
- Foreach语法
先看例子: Random rand = new Random(47); float f[] = new float[10]; for(int i = 0; i < 10; i++){ f[i] ...
- Python顺序与range和random
range([start,] stop[, step]) start是开始,stop是停下,step是步长. >>> range(10) range(0, 10) >>& ...
- 配置squid代理服务
1. 简述一下squid的用途?squid可以做代理和缓存服务器,而做代理时,可以分为正向代理和反向代理.正向代理用在企业办公环境中,企业员工上网通过代理来上网,代理的缓存功能可以为企业节省宝贵的带宽 ...
- MacOS U盘安装
通过Mac上的App Store下载安装程序 插入U盘 启动终端 输入命令 sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/R ...
- spark-sql
本文用到的测试数据person.txt lijing 29 guodegang 45 heyunwei 30 yueyunpeng 100 rdd的分区数量,读取hdfs文件,默认是文件个数 rdd生 ...