这题代码是参考别人的,


参考代码:

import java.util.Arrays;
import java.util.Scanner;
public class 砝码称重 {
public static int n;
public static int a[];
public static int k[];
public static int flag;
public static int mg;
 public static void main(String[] args) {
  Scanner in=new Scanner(System.in);
  n=in.nextInt();
  int m=in.nextInt();
  a=new int[n];//n个砝码用数组a表示,
  k=new int[n+1];
  int temp=0;
  for(int i=0;i<n;i++)
  {
   a[i]=in.nextInt();
  }
  Arrays.sort(a);
  for(int i=n-1;i>=0;i--){//从右边往左数,用了i个砝码,剩下的砝码重量之和
   k[i]=k[i+1]+a[i];
  }
  //m个物品用数组b表示
  for(int i=0;i<m;i++)
  { 
  flag=0;
  mg=in.nextInt();
 
  
   dfs(0,0);
   if(flag==1)System.out.println("YES");
   else System.out.println("NO");
  }
 }
 private static void dfs(int sum,int i) {//i表示砝码数组下标
 if(flag==1){return;}
 if(sum==mg){flag=1;return;}
 if(Math.sqrt(sum)-mg>=k[i]){return;}//现在砝码的重量减去物品重量大于剩余砝码重量,推出循环
  for(i=i;i<n;i++){
   
   dfs(sum+a[i],i+1);
   dfs(sum-a[i],i+1);
   
  }
  
 }
 
}

 

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

renqinghua 4年前 回复TA
为什么代码39行那要开方了在减
Faith 6年前 回复TA
@竹动1949 谢谢,原来是这回事
竹动1949 6年前 回复TA
砝码不一定只放在右边,左边也可以放。比如有19,3,1这三个砝码,是可以称质量为18的物体:18(物体)+1(砝码)=19(砝码)。