盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重
发布日期:2021-06-24 16:15:45 浏览次数:4 分类:技术文章

本文共 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;

}

转载地址:https://blog.csdn.net/weixin_33758343/article/details/114942080 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java输出狗的各类信息_第九章Java输入输出操作
下一篇:java窗口内容如何复制_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)...

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月19日 01时51分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章