java-HJ41_称砝码

java-HJ41 称砝码

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

/**
 * HJ41 称砝码
 * @author d3y1
 */
public class Main {
    private static int n;
    private static HashSet<Integer> set = new HashSet<>();

    public static void main(String[] args) {
        // solution1();
        solution2();
        // solution3();
    }

    /**
     * dfs: 超时!
     */
    private static void solution1(){
        Scanner in = new Scanner(System.in);
        // 砝码种类
        n = in.nextInt();
        // 砝码重量
        int[] m = new int[n];
        // 砝码数量
        int[] x = new int[n];

        for(int i=0; i<n; i++){
            m[i] = in.nextInt();
        }

        for(int i=0; i<n; i++){
            x[i] = in.nextInt();
        }

        dfs(m, x, 0, 0);

        System.out.println(set.size());
    }

    /**
     * dfs
     * @param m
     * @param x
     * @param idx
     * @param sum
     */
    private static void dfs(int[] m, int[] x, int idx, int sum){
        set.add(sum);

        if(idx == n){
            return;
        }

        // 此处耗时
        for(int i=idx; i<n; i++){
            for(int j=0; j<=x[i]; j++){
                dfs(m, x, i+1, sum+m[i]*j);
            }
        }
    }

    /**
     * 哈希
     */
    private static void solution2(){
        Scanner in = new Scanner(System.in);
        // 砝码种类
        n = in.nextInt();
        // 砝码重量
        int[] m = new int[n];
        // 砝码数量
        int[] x = new int[n];

        for(int i=0; i<n; i++){
            m[i] = in.nextInt();
        }

        for(int i=0; i<n; i++){
            x[i] = in.nextInt();
        }

        set.add(0);
        ArrayList<Integer> weights;
        for(int i=0; i<n; i++){
            weights = new ArrayList<>(set);
            for(int weight: weights){
                for(int j=1; j<=x[i]; j++){
                    set.add(weight+m[i]*j);
                }
            }
        }

        System.out.println(set.size());
    }

    /**
     * 动态规划
     */
    private static void solution3(){
        Scanner in = new Scanner(System.in);
        // 砝码种类
        n = in.nextInt();
        // 砝码重量
        int[] m = new int[n];
        // 砝码数量
        int[] x = new int[n];

        for(int i=0; i<n; i++){
            m[i] = in.nextInt();
        }

        // 总重量
        int sum = 0;
        for(int i=0; i<n; i++){
            x[i] = in.nextInt();
            sum += m[i]*x[i];
        }

        // dp[i]表示砝码能否组成重量i
        boolean[] dp = new boolean[sum+1];
        dp[0] = true;

        for(int i=0; i<n; i++){
            for(int j=1; j<=x[i]; j++){
                // 降序
                for(int k=sum; k>=m[i]; k--){
                    if(dp[k-m[i]]){
                        dp[k] = true;
                    }
                }
            }
        }

        int kind = 0;
        for(int i=0; i<=sum; i++){
            if(dp[i]){
                kind++;
            }
        }

        System.out.println(kind);
    }
}
### 回答1: hj-4wd_pwm_fk.h是一个C编程语言程序的头文件。该头文件中包含了一些函数和定义,用于控制四轮驱动机器人的PWM(Pulse Width Modulation,脉宽调制)输出。 在机器人控制中,PWM信号可以用来控制电机的速度和方向,实现机器人前进、后退、转向等功能。hj-4wd_pwm_fk.h中定义了一些函数,可以设置PWM的占空比和频率,并可以控制机器人的运动。 除了PWM输出控制函数之外,hj-4wd_pwm_fk.h还定义了一些常量和类型,可以方便地控制各种传感器和电机组件。这些常量和类型包括PIN定义(用于指定GPIO端口)和MOTOR定义(用于指定电机类型和输出配置)。 总的来说,hj-4wd_pwm_fk.h提供了一组函数和常量,可以用来控制hj-4wd_pwm_fk机器人的电机、传感器和其他组件,从而实现各种机器人运动控制功能。 ### 回答2: hj-4wd_pwm_fk.h是一段控制四轮驱动车辆PWM的C语言代码。其中,PWM表示脉冲宽度调制,是一种调节电子设备输出的电压或电流的方法。hj-4wd_pwm_fk.h中的代码提供了对车辆四个轮子的PWM输出控制。该代码还使用了前向运动、后向运动、左转和右转函数,可以控制车辆的各种动作。此外,代码还包含了I2C总线通信相关函数以及其他常用的控制指令函数。在程序使用中,需要先将hj-4wd_pwm_fk.h中的头文件包含进来,然后再调用相关的函数进行控制。这段代码能够使得用户轻松地控制四轮驱动车辆,实现各种动作和指令的发送。但是,正确的使用本代码需要相关知识和技能,并且在实际应用中还需要做好安全相关的措施,以免发生意外。 ### 回答3: hj-4wd_pwm_fk.h是一种用于机器人控制的驱动程序,它使用PWM控制信号驱动机器人车辆的电机运动。这种驱动程序适用于4个轮子驱动(4WD)的机器人车辆。该程序中的FK(Forward Kinematics)功能可以将机器人车辆的运动转换为位置和方向的数学模型,使得用户可以通过编程实现车辆的运动控制。通过使用该驱动程序,用户可以轻松控制机器人车辆的速度和转向,以及实现均衡和定位控制等高级功能。此外,该驱动程序还提供了可扩展性和灵活性,用户可以根据需要对控制参数进行修改,以满足不同的应用需求。总之,hj-4wd_pwm_fk.h是一种功能强大、易于使用的机器人控制驱动程序,适用于各种机器人应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值