称砝码 动态规划 华为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
- 称砝码 动态规划 华为OJ
- 称砝码 -动态规划 华为OJ
- 华为oj 称砝码
- 华为oj 称砝码
- 华为oj:称砝码
- 华为oj 称砝码
- [华为OJ] 称砝码
- 【华为OJ】称砝码
- 华为OJ:称砝码
- 华为OJ称砝码
- 华为OJ之称砝码
- 华为OJ 初级:称砝码
- 华为OJ之称砝码
- 华为OJ题目(十):称砝码
- 华为OJ——称砝码
- 华为OJ——称砝码
- 华为oj_称砝码
- 华为测试 称砝码
- Android应用程序用户界面(五)
- jquery中 val()操作 与 复选框、下拉列表、单选按钮的设置
- HDU 2296
- 解决 build_native.py 出现CCLuaBridge.o错误
- 多张图片并列显示的问题
- 称砝码 动态规划 华为OJ
- Linux系统管理-(2)--磁盘的挂载与卸载
- android imageLoader 使用缓存策略
- Flume - 重新编译源码
- 关于实例化,以及面向对象new 与不new的区别
- android的广播事件
- Codeforces Round #281 (Div. 2) E. Vasya and Polynomial 数学 思考题
- PID_MAX_DEFAULT
- 2015.08极速下载Android SDk