zoukankan      html  css  js  c++  java
  • 数字和为sum的方法数(动态规划)

    题目描述

    给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
    当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。

    输入描述:

    输入为两行:
    第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
    第二行为n个正整数A[i](32位整数),以空格隔开。

    输出描述:

    输出所求的方案数
    示例1

    输入

    5 15 5 5 10 2 3

    输出

    4
     1 import java.util.Scanner;
     2 
     3 /** 
     4  * @author Dell
     5  *
     6  */
     7 public class Main {
     8 static public long dp[][];
     9 public static void main(String[] args) {
    10     Scanner sc = new Scanner(System.in);
    11     int n = sc.nextInt();
    12     int sum = sc.nextInt();
    13     int [] p = new int[(int) (n+1)];
    14     /**
    15      * 循环全部从1开始
    16      * 
    17      */
    18     for (int i= 1; i < p.length; i++) {
    19         p[i] = sc.nextInt();
    20     }
    21     dp = new long[n+1][sum+1];
    22     for (int i = 0; i <n+1; i++) {
    23         for (int j = 0; j <sum+1; j++) {
    24             dp[i][j] = 0;
    25         }
    26     }
    27     dp[0][0] = 1; //初始化 0 行
    28     for (int i = 1; i <=n; i++) { 
    29         for (int j = 0; j <=sum; j++) { // 0-sum列
    30             long k;
    31             if (j-p[i]<0) {
    32                 k = 0;
    33             }else {
    34                 k = dp[i-1][j-p[i]];
    35             }
    36             dp[i][j] = dp[i-1][j]+k;
    37         }
    38     }
    39     System.out.println(dp[n][sum]);
    40 }
    41 }
  • 相关阅读:
    【概念】using 三种使用方式
    2019-7-2 作业1 2 3
    异常
    java.lang.NullPointerException
    课外作业(建立double类型的小数,按照四舍五入保留2位小数)
    作业1.2.3.4
    左自增与右自增的区别
    深入了解JVM(Java虚拟机)
    Eclipse报错Could not resolve archetype
    ThinkPad E550 连蓝牙鼠标logitech M557
  • 原文地址:https://www.cnblogs.com/the-wang/p/8981278.html
Copyright © 2011-2022 走看看