最优装载问题,在贪心算法里有一个版本。回溯算法里,最优装载问题发生了变化
问题描述
小j买东西有个特点,不一定买好的,也不一定要买的多,只要能恰好把身上的钱花光就好。现在给出n个物品的价格Ai以及小j身上的现金S,假设每个物品的数目只有一个,请问他能将身上所带的钱花完吗?
输入
第一行输入一个数字n表示物品的数目(n ≤ 36),一个数字S表示小j所带的钱( 1≤S≤1e12),用空格隔开。
接下来一行n个数字,每两个数字之间用空格隔开,第i个数字Ai表示第i个物品的价格( 1≤Ai≤1e12)。
输出
若能在n个物品中其恰好购买总和为S的物品请输出”YES”(不带引号),否则输出”NO” (不带引号)。
样例输入
6 10
2 4 8 5 3 4
样例输出
YES
思路
这个题实质还是最优装载问题,不同的是这里要求必须凑出符合题目要求的数字。
本题回溯算法的解空间是一个子集树,对于第n个结点,可以向下延伸到第n+1个结点。左子树为选择该现金,右子树为不选择该现金,如果之前已经凑出了题目要求的现金或者剩余的现金和当前的现金之和小于题目要求的现金数额,则不再向下递归(剪枝条件)
代码:
#include<stdio.h>
typedef long