zoukankan      html  css  js  c++  java
  • 数字和为sum的方案数

    问题描述:
    给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
    当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
    输入描述:
    输入为两行: 第一行为两个正整数n,sum,第二行为n个正整数A[i](32位整数),以空格隔开。
    输出描述:
    输出所求的方案数
    示例1
    输入
    3 40
    20 20 20
    输出
    3

     代码如下:

    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while(sc.hasNextInt()){
                int n = sc.nextInt();
                int[] arr = new int[n+1];
                //该数组第一个元素为0,其余元素为要输入的元素
                arr[0] = 0;
                for(int i = 1;i<=n;i++){
                    arr[i] = sc.nextInt();
                }
                System.out.println(nNumAddSumCount(arr,40));
            }
            
        }
    
        public static long nNumAddSumCount(int[] arr,int sum){
            int n = arr.length;
            //定义二维数组,用来表示方法数
            long[][] dp = new long[n+1][sum+1];
            //对第一列全部赋1
            for(int i = 0;i<=n;i++){
                dp[i][0] = 1;
            }
            //对第一行除第一个位置外其余赋0
            for(int i = 1;i<=sum;i++){
                dp[0][i] = 0;
            }
            for(int i = 1;i<=n;i++){
                for(int j = 1;j<=sum;j++){
                    //如果arr[i]>j,此时(i,j)位置的值为(i-1,j)位置的值
                    if(arr[i-1]>j){
                        dp[i][j] = dp[i-1][j];
                    }else{
                        dp[i][j] = dp[i-1][j]+dp[i-1][j-arr[i-1]];
                    }
                }
            }
            return dp[n][sum];
        }
    }
  • 相关阅读:
    sql server中使用链接服务器访问oracle数据库
    biztalk中使用信封(Envelope)消息
    EMS SQL Manager 2007 for MySQL发布
    MySQL Connector/NET
    Silverlight相关资源
    ADO.NET嵌套数据绑定
    收到网上订得书了,开始充电...
    几个.net下的ajax框架
    Visual Studio 2008 Beta 2 初步体验
    .Net Remoting常用部署结构
  • 原文地址:https://www.cnblogs.com/du001011/p/10919053.html
Copyright © 2011-2022 走看看