"""
题目:有n个重量分别为w={w_1,w_2,…,w_n}的物品,他们的价值分别为v={v_1,v_2,…,v_n},给定一个容量为G的背包。
设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中,要求选中的物品不仅能够放到背包中,并且背包内物品的总价值达到最大。
输入格式:
第一行输入两个整数n、G,其中n表示物品的数量,G表示背包的容量体积。
第二行输入n个整数,整数间以空格分隔,表示n个物品的重量w_i
第三行输入n个整数,整数间以空格分隔,表示n个物品的价值v_i
输出格式:
第一行输出最大价值是V,V是计算得到的背包内物品总价值的最大值
第二行输出最大价值共有K种选择方案,分别是:,K是最大价值时,背包内物品选择的方案总数。
随后K行输出选择第x1 x2 ... xn个物品,x1、x2、...xn、是选择的第几个物品,中间以空格分隔,输出顺序以字典序排序。
输入样例:
5 13
3 4 4 5 10
4 9 9 10 24
输出样例:
最大价值是28
最大价值共有2种选择方案,分别是:
选择第2 3 4个物品
选择第1 5个物品
"""
def knapsack_backtrack(n, G, weights, values):def backtrack(i, current_weight, current_value, current_items):nonlocal max_valuenonlocal max_solutionsif i == n:if current_value > max_value:max_value = current_valuemax_solutions = [list(current_items)]elif current_value == max_value:max_solutions.append(list(current_items))return# 不选择当前物品backtrack(i + 1, current_weight, current_value, current_items)# 选择当前物品if current_weight + weights[i] <= G:current_items.append(i + 1)backtrack(i + 1, current_weight +weights[i], current_value + values[i], current_items)current_items.pop()max_value = 0max_solutions = []backtrack(0, 0, 0, [])return max_value, max_solutions# 输入
n, G = map(int, input().split())
weights = list(map(int, input().split()))
values = list(map(int, input().split()))# 计算并输出最大价值和方案
max_value, solutions = knapsack_backtrack(n, G, weights, values)
print("最大价值是{}".format(max_value))
print("最大价值共有{}种选择方案,分别是:".format(len(solutions)))
for solution in solutions:print("选择第{}个物品".format(' '.join(map(str, solution))))