算法提高 盾神与砝码称重

47 篇文章 0 订阅
2 篇文章 0 订阅
问题描述
  有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太无聊了,于是就丢给了你。
输入格式
  第一行为两个数,n和m。
  第二行为n个数,表示这n个砝码的重量。
  第三行为m个数,表示这m个物品的重量。
输出格式
  输出m行,对于第i行,如果第i个物品能被称出,输出YES否则输出NO。
样例输入
4 2
1 2 4 8
15 16
样例输出
YES
NO
样例输入
4 1
10 7 1 19
6
样例输出
YES
数据规模和约定

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



#include<iostream>
#include<algorithm> 
#include<cstring>
#include<cstdio>
using namespace std;
bool comper(int x, int y){
	return x>y;
}
int map[25]={0};
long values[25]={0};
int value;
int m,n;
bool flag = false;
void dfs(int x, int sum){
	if(flag)
	return ;
	if(abs(sum)>values[x]){
		return ;
	}
	if(sum==0){
		flag = true;
		return ;
	}
	for(;x<n;x++){
		dfs(x+1, sum+map[x]);
		dfs(x+1, sum-map[x]);
		
	}
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i=0;i<n;i++){
		
		scanf("%d", &map[i]);
	}
	sort(map,map+n,comper);
	for(int i=n-1;i>=0;i--){
		values[i]=map[i]+values[i+1];//i之前的总和 
	}
	
	while(m--){
		flag = false;
		scanf("%d", &value);
		dfs(0,value);
		if(flag)
		printf("YES\n");
		else
		printf("NO\n");	
}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值