称砝码 动态规划

题目要求:
有一组砝码,重量互不相等,分别为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。

发布了45 篇原创文章 · 获赞 8 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/iNiegang/article/details/48087905