第十二届蓝桥杯 砝码称重
Published on 2022-11-17 23:03 in 暂未分类 with 林动

第十二届蓝桥杯 砝码称重

    在这里插入图片描述

    暴搜 只能过50%

    import java.util.*;
    
    public class Main
    {
    	static int n,N=100005,ans;
    	static boolean st[]=new boolean [N];
    	static boolean us[]=new boolean [N];
    	static int a[]=new int [N];
    	
    	static void dfs(int t,int from,int p)
    	{
    		if(t==n+1)return;
    		for(int i=from;i<n;++i)
    		{
    			if(us[i]==false)
    			{
    				us[i]=true;
    				int d=Math.abs(p-a[i]);
    				
    				st[p+a[i]]=true;
    				dfs(t+1,i+1,p+a[i]);
    				st[d]=true;
    				dfs(t+1,i+1,d);
    				
    				us[i]=false;
    			}
    		}
    		
    	}
    	
    	public static void main(String args[])
    	{
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextInt();
    		for(int i=0;i<n;++i)
    		{
    			a[i]=sc.nextInt();st[a[i]]=true;
    		}
    		dfs(1,0,0);
    		for(int i=1;i<N;++i)
    			if(st[i])ans++;
    		System.out.println(ans);
    	}
    }
    

    模拟可以AC,因为给定条件说了砝码总的重量在10^5内

    import java.util.*;
    
    public class Main
    {
    	static int n,N=100005,ans;
    	static boolean st[]=new boolean [N],backup[]=new boolean[N];
    	static int a[]=new int [N];
    	
    	public static void main(String args[])
    	{
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextInt();
    		
    		for(int i=0;i<n;++i)
    		{
    			a[i]=sc.nextInt();
    		}
    		
    		for(int i=0;i<n;++i)
    		{
    			backup=st.clone();
    			for(int j=1;j<N;++j)
    			{
    				if(backup[j]==true)
    				{
    					int d=Math.abs(j-a[i]);
    					st[j+a[i]]=true;
    					st[d]=true;
    				}
    			}
    			st[a[i]]=true;
    		}
    		for(int i=1;i<N;++i)
    			if(st[i])ans++;
    		System.out.println(ans);
    	}
    }
    

    DP

    import java.util.*;
    
    public class Main
    {
    	static int N=105,M=200005,S=M/2;
    	static boolean f[][]=new boolean [N][M];
    	static int w[]=new int [N];
    	static int n,m,ans;
    	
    	public static void main(String args[])
    	{
    		Scanner sc=new Scanner(System.in);
    		n=sc.nextInt();
    		
    		for(int i=1;i<=n;++i)
    		{
    			w[i]=sc.nextInt();
    			m+=w[i];
    		}
    		
    		f[0][S]=true;
    		
    		for(int i=1;i<=n;++i)
    		{
    			for(int j=-m;j<=m;++j)
    			{
    				
    				f[i][j+S]=f[i-1][j+S];
    				if(j-w[i]+S>=0)f[i][j+S]|=f[i-1][j+S-w[i]];
    				if(j+w[i]+S<M)f[i][j+S]|=f[i-1][j+S+w[i]];
    			}
    		}
    		for(int i=1;i<=m;++i)
    			if(f[n][i+S])ans++;
    		
    		System.out.println(ans);
    	}
    }
    
    posted @   林动  阅读(12)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
    · 使用C#创建一个MCP客户端
    · ollama系列1:轻松3步本地部署deepseek,普通电脑可用
    · 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
    · 按钮权限的设计及实现
    点击右上角即可分享
    微信分享提示