前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯官网 试题 PREV-265 历届真题 砝码称重【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法

蓝桥杯官网 试题 PREV-265 历届真题 砝码称重【第十二届】【省赛】【研究生组】【C++】【C】【Java】【Python】四种解法

作者头像
红目香薰
发布2022-11-30 16:57:53
2850
发布2022-11-30 16:57:53
举报
文章被收录于专栏:CSDNToQQCode

为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

C++

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
const long long inf = 0x7fffffffffffffff;
bool dp[106][100006];
int a[106];
int main()
{
    int i,j,n,sum = 0; cin>>n;
   for(i = 1;i <= n;i++){
      cin>>a[i];
      sum+= a[i];
   }

   for(i = 1;i <= n;i++){
       for(j = 1;j <= sum;j++){
           dp[i][j] = dp[i-1][j];
           if(!dp[i][j]){
               if(j == a[i]) dp[i][j] = 1; 
                //判定的值与当前选择的砝码相等
               if(dp[i-1][j + a[i]])  dp[i][j] = 1;
      //检查当前i砝码与上一个状态(之前组合出的值)放在不同侧,是否可以组成j。
               if(dp[i-1][abs(j-a[i])]) dp[i][j] = 1;
      //检查当前i砝码与上一个状态(之前组合出的值)放在同一侧,是否可以组成j。
           }
       }
   }

   long long ans = 0;
    for(j = 1;j <= sum;j++) if(dp[n][j]) ans++;
    cout<<ans;
    return 0;
}

C

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

enum
{
   ZDZZL = 100000 ,
   KY = 1 ,
   BX = 0 ,
} ;
void shuru(int,int []);
int qiu_zhongshu(int,int []);
int qiu_he(int,int []);
void jia( int , int [] , int ) ;
void bingru(int , int [],int []); 
int qiu_kys(int , int []);

void t_keyi(int n, int a[])
{
   while ( n -- > 0 )
   {
      printf("%d ",* a ++ ) ;
   }   
   putchar('\n');
}

int main(void)
{
   int n;
   scanf("%d",&n);
   int fama[n] ;
   shuru(n,fama);
   printf("%d\n",qiu_zhongshu(n,fama));
	return 0 ;
} 

int qiu_kys(int n, int ky[])
{
   int kys = 0 ;
   while ( n -- > 0 )
   {
      kys += * ky ++ ;
   }
   return kys ;
}

void bingru(int n, int y[],int x[])
{
   while ( n -- > 0 )
   {
      * y = * y || * x ;
      y ++ ;
      x ++ ;
   }
}

/*
3
6
  K K K    K K K  K K  K
K K K K K K K K B K K  K 元素值表示是否可以 
0 1 2 3 4 5 6 7 8 9 10 11  用下标表示重量    
*/
void jia( int gs , int ky[] , int fmz )
{
   int zj[1+ZDZZL] = { BX } ; //记录可以增加的重量 
   int zl ;//用下标表示重量
   for ( zl = 0 ; zl < gs ; zl ++ )
   {
      if ( zl[ky] == KY ) 
      {
         zj[zl + fmz] = KY ;
         zj[abs(zl - fmz)] = KY ;
      }
   }
   bingru(gs,ky,zj); 
}

int qiu_he(int n,int a[])
{
   int he = 0 ;
   while ( n -- > 0 )
   {
      he += * a ++ ;
   }
   return he ;   
}

int qiu_zhongshu(int n,int fm[])
{
   int keyi[1+ZDZZL] = { KY } ; 
   int zzl = qiu_he(n,fm) ;
   while ( n -- > 0 )
   {
      jia( zzl + 1 , keyi , *fm ++) ;
   }
   return qiu_kys(zzl , keyi + 1);
}

void shuru(int n,int f[])
{
   while ( n -- > 0 )
   {
      scanf("%d",f ++ );
   }
}

Java

代码语言:javascript
复制
import java.io.*;

public class Main {
    static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
    static int N=105;
    static int[] a=new int[N];
    static int[] b=new int[N];
    static int n,m=0;
    static boolean[][] f=new boolean[105][100010];
    public static void main(String[] args) throws IOException {
        n = Integer.parseInt(bf.readLine().trim());
        String[] temp = bf.readLine().trim().split(" ");
        f[0][0]=true;
        b[0]=0;
        for (int i = 1; i <= n; i++){
            a[i] = Integer.parseInt(temp[i - 1]);
            b[i]=b[i-1]+a[i];
        }
        for (int i = 1; i <=n ; i++) {
            for (int j=0;j<=b[i];j++){
                f[i][j]=f[i-1][j] || f[i-1][Math.abs(j-a[i])] || f[i-1][j+a[i]];
            }
        }
        int cnt=0;

        for (int i=1;i<=b[n];i++){
            if (f[n][i]){
                cnt++;
            }
        }
        System.out.println(cnt);
    }

}

Python

代码语言:javascript
复制
def res(num, se):
    N = len(se)
    s = set()
    if N == 0:
        se.add(num)
        return 1
    for set_ in se:
        s.add(abs(set_-num))
        s.add(abs(set_+num))
    se.add(num)
    for i in s:
        se.add(i)
    return len(se)

if __name__ == '__main__':

    n = int(input())
    nums = list(map(int, input().split()))
    nums.sort()
    se = set()
    dp = [0 for x in range(0, 100)]
    for i in range(n):
        dp[i] = res(nums[i],se)

    if 0 in se:
        dp[n - 1] = dp[n-1] - 1
    print(dp[n-1], end='')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++
  • C
  • Java
  • Python
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档