【小米】 2019 秋招笔试题 (数组组合、最优分割)

在这里插入图片描述
在这里插入图片描述

这题类似“数组组合”问题(题目:输入一个数字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/

猜你喜欢

转载自blog.csdn.net/eqiang8848/article/details/82804994
今日推荐