博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重
阅读量:1543 次
发布时间:2019-04-21

本文共 1034 字,大约阅读时间需要 3 分钟。

时间限制: 1Sec 内存限制: 128MB 提交: 58 解决: 15

题目描述

有一天,他在宿舍里无意中发现了一个天平!这  个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就  知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太无聊了,于是就丢给了你。

数据规模和约定

1< =n< =24,  1< =m< =10.

输入

第一行为两个数,n和m。

第二行为n个数,表示这n个砝码的重量。

第三行为m个数,表示这m个物品的重量。

输出

输出m行,对于第i行,如果第i个物品能被称出,输出YES否则输出NO。

样例输入

4 2

1 2 4 8

15 16

样例输出

YES

NO

对于这道题的砝码,每个砝码有三种情况,和物品放在一起,不放,放在物品另一边,因此直接进行搜索,

#include

#include

#include

#include

using namespace std;

int a[26],sum[26]={0};

int flag=0;

void dfs(int s,int k)///s表示物品盘和砝码盘相差的重量

{

if(flag==1)///判断是否已经称出来

return;

if(abs(s)>sum[k])///判断以后的砝码是否能称出来现在的重量

return;

if(s==0||abs(s)==sum[k])///判断称的两边是否平衡

{

flag=1;

return;

}

if(k<0)///所有砝码已经使用

return;

dfs(s-a[k],k-1);///放在物品对面

dfs(s,k-1);///不放

dfs(s+a[k],k-1);///和物品放一起

return;

}

int main()

{

int n,m;

cin>>n>>m;

for(int i=0;i

{

cin>>a[i];

if(i>0)

sum[i]=sum[i-1]+a[i];///前i个砝码重量和

else

sum[0]=a[0];

}

while(m--)

{

int s;

cin>>s;

flag=0;

dfs(s,n-1);

if(flag==1)///判断是否称出来

printf("YES\n");

else

printf("NO\n");

}

return 0;

}

转载地址:http://lerdy.baihongyu.com/

你可能感兴趣的文章
【Linux】CP&SCP的说明及其区别
查看>>
【Openwrt】防火墙IP加入黑名单步骤
查看>>
【Redis】简介
查看>>
【Java】 IDEA打war包方式
查看>>
【Linux】Oracle VM VirtualBox 安装CentOS7操作系统
查看>>
【Scala】简述&安装环境部署
查看>>
【Scala】基础之集合&序列操作大全
查看>>
【ElasticSearch】分布式安装&集群部署(6.2.2)版本
查看>>
阿里云证书过期问题
查看>>
webftp开通账号流程
查看>>
NoSQLBooster for MongoDB基本使用步骤
查看>>
【MySQL】加库名及创建账户密码
查看>>
【ElasticSearch】ES中显示打开文件数过多问题解决
查看>>
阿里云证书问题
查看>>
如何爬取微信公众号文章(一)
查看>>
如何爬取微信公众号文章(二)
查看>>
如何爬取抖音小视频
查看>>
利用Python爬取租房信息
查看>>
如何爬取看雪学院的课程
查看>>
如何爬取i春秋网课
查看>>