版权声明:本文为博主原创文章,未经博主允许不得转载,欢迎添加友链。 https://blog.csdn.net/qq_42835910/article/details/89303607
问题描述
有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太无聊了,于是就丢给了你。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int w[25], max_sum[25]; //当余下n-i个Wi时的最大值。
int n, m;
bool cmp(int x, int y){
return x > y;
}
int flag = 1;
void solve(int cur, int sum){
if(flag) return;
if(abs(sum) > max_sum[cur]) return; // abs(sum) 大于n-i个Wi的最大和,肯定凑不出来,剪枝
if(sum == 0 ){
flag = 1;
return;
}
for(; cur < n; cur++){
solve(cur+1, sum - w[cur]);
solve(cur+1, sum + w[cur]);
}
}
int main(int argc, char** argv) {
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++)
scanf("%d",&w[i]);
sort(w, w+n, cmp);
for(int i=n-1; i>=0; i--)
max_sum[i] = max_sum[i+1] + w[i];
while(m--){
int x;
scanf("%d",&x);
flag = 0;
solve(0,x);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
输入格式
第一行为两个数,n和m。
第二行为n个数,表示这n个砝码的重量。
第三行为m个数,表示这m个物品的重量。输出格式
输出m行,对于第i行,如果第i个物品能被称出,输出YES否则输出NO。
样例输入
4 2
1 2 4 8
15 16样例输出
YES
NO扫描二维码关注公众号,回复: 6028451 查看本文章样例输入
4 1
10 7 1 19
6样例输出
YES
数据规模和约定
1<=n<=24, 1<=m<=10.