原题链接:蓝桥杯算法提高VIP-盾神与砝码称重
解题思路:dfs三种情况就行了 放物体一边 不放 放物体对面
注意事项:
参考代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n, m;
int num;
int a[25], sum[25];
int flag = 0;
void fun(int x, int y)
{
if(flag == 1)
{
return ;
}
if(abs(x)>sum[y])///判断以后的砝码是否能称出来现在的重量
return;
if(x == 0||abs(x)==sum[y])
{
flag = 1;
return ;
}
if(y<0)
{
return;
}
fun(x-a[y], y-1);//不和物品放一起
fun(x, y-1);//不放砝码
fun(x+a[y], y-1);//放在物品的对立边
return;
}
int main()
{
cin>>n>>m;
for(int i = 0; i < n; i++)
{
cin>>a[i];
if(i>0)
sum[i]=sum[i-1]+a[i];///前i个砝码重量和
else
sum[0]=a[0];
}
// sort(a, a+n);
for(int i = 0; i < m; i++)
{
flag = 0;
cin>>num;
fun(num,n-1);
if(flag == 0)
{
cout<<"NO"<<endl;;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复