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