数字和为Sum的方案数-Python2.7实现-途家2019秋招笔试题

6 篇文章 0 订阅
1 篇文章 0 订阅

问题描述:

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

输入:

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

输出:

输出所求的方案数
例子:
输入:
5 5 10 2 3
输出:
4

思路:

这里写图片描述
动态规划图解

# Python Interpreter: Python 2.7.2
    #问题描述引自:
    > https://blog.csdn.net/zhengjihao/article/details/77921617
    #动态规划图解引自:
    > https://www.cnblogs.com/chongerlishan/p/6255005.html
# Author: Qiankun Wang
# Data: 2018.9.12
# -*- coding:utf-8 -*-
def MethodsSum(array,sum):
    dp = [[0 for i in range(sum+1)] for i in range(n+1)]
    for i in range(n+1):
        dp[i][0] = 1
    dp[0][0] = 1
    array.insert(0,0)
    for i in range(1,n+1):
        dp[i][0] = 1
        for j in range(1,sum+1):
            if array[i] > j:
                dp[i][j] = dp[i-1][j]
            else:
                # 用前i-1个数组成s-array[i]的方案数+用前i-1个数组成s的方案数
                dp[i][j] = dp[i-1][j-array[i]] + dp[i-1][j]
    return dp[n][sum]
if __name__ == "__main__":
    array = [5,5,10,2,3]
    n = len(array)
    sum = 15
    # n,sum = map(int,raw_input().split())
    # array = map(int,raw_input().split())
    print MethodsSum(array,sum)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值