算法提高 盾神与砝码称重

版权声明:本文为博主原创文章,未经博主允许不得转载,欢迎添加友链。 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.

猜你喜欢

转载自blog.csdn.net/qq_42835910/article/details/89303607
今日推荐