最优装载问题(回溯经典问题 子集树)

最优装载问题,在贪心算法里有一个版本。回溯算法里,最优装载问题发生了变化

问题描述

小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 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值