首页 > 试题广场 >

神奇的口袋

[编程题]神奇的口袋
  • 热度指数:18636 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入描述:
输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。


输出描述:
输出不同的选择物品的方式的数目。
示例1

输入

3
20
20
20

输出

3
def findCountsNum(tempSum,nowIndex):   #通过当前的下标和前面加的数字和进行查找
    if nowIndex >= num:
        return
    if tempSum + digitNums[nowIndex] == 40:
        global count
        count += 1
        findCountsNum(tempSum,nowIndex+1)
    elif tempSum+digitNums[nowIndex] < 40:
        findCountsNum(tempSum+digitNums[nowIndex],nowIndex+1)
        findCountsNum(tempSum,nowIndex+1)


while True:
    try:
        num = int(input())
        digitNums = []
        for i in range(num):
            digitNums.append(int(input()))
        digitNums.sort()
        count = 0
        findCountsNum(0,0)
        print(count)
    except Exception:
        break
编辑于 2018-10-01 23:05:27 回复(0)

python解法:使用dfs来做的。

def dfs(arr,vol):
    global res
    if vol<0:
        return
    if vol==0:
        res+=1
        return
    for i,v in enumerate(arr):
        dfs(arr[i+1:],vol-v)
while True:
    try:
        a, arr = int(input()), []
        for i in range(a):
            arr.append(int(input()))
        res=0
        dfs(arr,40)
        print(res)
    except:
        break

不过这种解法对于这道题来说是可以的,因为给的数量比较小。如果是比较大的数组就GG了。DP才是正路子啊

编辑于 2017-10-17 10:18:28 回复(0)