小塔的团队面临一个大项目,包含n个需求,每个需求需要不同的人天工作量。团队的工作量预算为T人天,目标是选择一些需求,使得在不超过T人天的前提下,所选需求的工作量总和最大。每个需求要么全部完成,要么不做。输入包含两行,第一行是两个整数n和T,第二行是n个整数,表示每个需求的工作量。输出一个整数,表示在预算内可以完成的最大工作量。
该题可以使用状态压缩动态规划(DP)或深度优先搜索(DFS)结合二分查找来解决。由于背包容量可达到 10^9,而物品数量 n 为 40,使用普通的 01 背包算法显然不可行,因为 2^40 的复杂度会爆炸。因此,我们可以将物品分成两个组,每组最多有 20 个物品,这样总的复杂度将减少到 2^20,大约在 100 万级别,仍然可以接受。
具体思路如下:
某团队来了一个大项目,该项目已知有n个需求,每个需求工作量分别需要t1、t2、t3.......tn人天,由于该项目需求过多,负责人小明决定先给出T人天预算完成部分需求。对于单个需求,每个任务要么不做,要么全部完成,必须耗时ti人天完成,现在小明想知道T人天的预算最多能做多少人天的需求。
输入共两行
首行是2个整数,以空格隔开,分别是n和T,n代表需求总数,T代表工作量评估不超过T人天
次行有n个整数,以空格隔开,分别是t1、t2、t3....tn,代表每个需求所需工作量,单位是人天
数据范围:1≤n≤40;1≤ti≤109;1≤T≤109
一个整数Ans,代表T人天的预算最多能做Ans人天的需求
输入
5 17
2 3 5 11 7
输出
17
说明
该项目有5个需求,工作量评估不超过17人天,每个需求工作量分别需要2人天、3人天、5人天、11人天、7人天;
小明选择需求1、需求2、需求3、需求5,所需工作量总和是2+3+5+7=17
输入
6 100
1 2 7 5 8 10
输出
33
说明
该项目有6个需求,工作量评估不超过100人天,每个需求工作量分别需要1人天、2人天、7人天、6人天、8人天、10人天;
小明选择全部需求,所需工作量总和是1+2+7+5+8+10=33
输入
6 100
101 102 103 104 105 106
输出
0
说明
该项目有6个需求,工作量评估不超过100人天,每个需求工作量分别需要101人天、102人天、103人天、104人天、105人天、106人天;
小明无论选择哪个需求都超过了100人天,所需工作量总和最大是0人天