称砝码 动态规划 华为OJ

来源:互联网 发布:软件时间限制工具 编辑:程序博客网 时间:2024/06/05 16:38

题目要求:
有一组砝码,重量互不相等,分别为m1、m2、m3……mn;它们可取的最大数量分别为x1、x2、x3……xn。
现要用这些砝码去称物体的重量,问能称出多少种不同的重量。
输入:
测试数据第一行一个整数n(n<=10),表示有多种不同的砝码;
第二行n个整数(中间用空格分隔),m1、m2、m3……mn,分别表示n个砝码的重量;(1<=mi<=20)
第三行n个整数(中间用空格分隔),x1、x2、x3……xn,分别表示n个砝码可取的最大数量。(1<=xi<=20)
输出:
每组数据输出仅一行,一个整数,表示利用给定的砝码可以称出的不同的重量数。
注:包括0。
Sample Input
2
1 2
2 1

本题目我是使用动态规划来解决的,以下是用java实现的具体代码

import java.util.Scanner;public class Main {    public static void main(String[] args){        Scanner scanner=new Scanner(System.in);        int N=scanner.nextInt();        int[] weight=new int[N];        int[] nums=new int[N];        for (int i = 0; i < N; i++) {            weight[i]=scanner.nextInt();                    }        for (int i = 0; i < N; i++) {            nums[i]=scanner.nextInt();        }        System.out.println(Measure(weight, nums, N));        scanner.close();    }    public static int Measure(int[] weight,int[] nums,int N){        int[] dp=new int[4001];        int total=0;        int count=0;        dp[0]=weight[0]*nums[0];         for (int i = 1; i <= nums[0]; i++) {            dp[weight[0]*i]=1;        }        for (int i = 1; i < N; i++) {            int m=dp[0];            for (int k = 1; k <=nums[i]; k++) {                for (int j = 0; j <= m; j++) {                    if (j+k*weight[i]>4000) {                        break;                    }                    if (dp[j]==1 && dp[j+k*weight[i]]!=1||j==0) {                        dp[j+k*weight[i]]=1;                        total=j+k*weight[i];                    }                }            }            dp[0]=total;        }        for (int j = 1; j <= 4000; j++) {            if (dp[j]==1) {                count+=1;            }        }        return count+1;    }}

标记为原创的博文均为本人辛苦码字所得,谢绝抄袭,转载请注明出处,新浪微博私信艾特:物联网工程_Niegang。

0 0
原创粉丝点击