问题描述:
给定一个有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)