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