题目描述
你打开了美了么外卖,选择了一家店,你手里有一张满X元减10元的券,店里总共有n种菜,第i种菜一份需要A_i元,因为你不想吃太多份同一种菜,所以每种菜你最多只能点一份,现在问你最少需要选择多少元的商品才能使用这张券。
输入描述:
第一行两个正整数n和X,分别表示菜品数量和券的最低使用价格。(1≤n≤100, 1≤X≤10000) 接下来一行n个整数,第i个整数表示第i种菜品的价格。(1≤A_i≤100)
输出描述:
一个数,表示最少需要选择多少元的菜才能使用这张满X元减10元的券,保证有解。
示例:
输入 | 输出 |
5 20 18 19 17 6 7 | 23 |
解题思路:
1.如果组合中第一道菜的价值a0小于满W减10的额度,即a0小于W:
如果组合中除去第一道菜(A-a0)后,仍满足满W减10的额度,即f(A-a0,W)>0:
则最少需要的菜价和为:min(f(A-a0,W-a0)+a0,f(A-a0,W))
如果组合中除去第一道菜(A-a0)后,不满足满W减10的额度,即f(A-a0,W)=0:(最后组合必须包含菜a0)
如果 菜a0选定后,剩余菜的组合(A-a0)满足W-a0的额度,即f(A-a0,W-a0)>0:
则最少需要的菜价和为:f(A-a0,W-a0)+a0
2. 如果组合中第一道菜的价值a0大于等于满W减10的额度,即a0大于等于W:
如果组合中除去第一道菜(A-a0)后,仍满足满W减10的额度,即f(A-a0,W)>0:
则最少需要的菜价和为:min(f(A-a0,W-a0)+a0,f(A-a0,W))
如果组合中除去第一道菜(A-a0)后,不满足满W减10的额度,即f(A-a0,W)=0:(最后组合必须包含菜a0)
则最少需要的菜价和为:a0
n,x=[int(x) for x in input().split()]
data=[int(x) for x in input().split()]
data_sum=[[0 for j in range(x+1)] for i in range(n)]
for i in range(n):
for j in range(1,x+1):
if i==0:
if j<=data[i]:
data_sum[i][j]=data[i]
else:
if j<=data[i]:
if data_sum[i-1][j]>0:
data_sum[i][j] = min(data[i],data_sum[i-1][j])
else:
data_sum[i][j]=data[i]
else:
if data_sum[i-1][j]>0:
data_sum[i][j] = min(data_sum[i-1][j-data[i]]+data[i], data_sum[i-1][j])
else:
if data_sum[i - 1][j - data[i]] > 0:
data_sum[i][j] = data_sum[i-1][j-data[i]]+data[i]
print(data_sum[-1][-1])