这题类似“数组组合”问题(题目:输入一个数字summ,输入n个数子,用这n个数有多少种组合成数字summ的方案(每个数字只能用一次)。)
思路:背包的方案数问题。并且这个题是一个物品只能用一次的背包,即01背包问题变化的方案数问题。
状态:dp[i]表示用这些数字组成数字i所有的方案数。一直从1到summ。
然后只需要把01背包的思路改动一下,就可以完成这个题了。
01背包第一层循环int i=1…n 表示第一个数到第n个数。
第二层循环int j=summ…1 表示组成的数字。
只需把两层循环里的max(dp[j],dp[j-w[i]])改成dp[j]+dp[j-w[i]]即可。
n = int(input())
w = [int(n) for n in input().split()]
w.insert(0,0)
summ=int(input())
dp=[0]*(summ+1)
dp[0] = 1
for i in range(1,n+1):
for j in range(summ,0,-1):
if j>=w[i]:
dp[j] = dp[j] + dp[j-w[i]] # dp[j]=不加入第i个物品时重量为dp[j]的方式+加入这次第i个物品,那么之前dp[j-w[i]]的放入方式
if dp[summ]>0:
print(1)
else:
print(0)
应该可以优化下,只判断大于1就行。不过这样能ac了。
这题类似“最佳加法表达式”,在这基础上改。
没改出来。
查到了,leetcode上的原题:https://leetcode.com/problems/split-array-largest-sum/