PAT顶级 1004 To Buy or Not to Buy - Hard Version (35分)

该博客介绍了如何解决PAT顶级题目1004的困难版本,采用深度优先搜索(DFS)策略进行暴力搜索。文章讨论了如何在搜索过程中进行两种剪枝操作:最优性剪枝和可行性剪枝,以提高效率。通过预处理数组来存储珠子信息,并在DFS中检查已购买珠子的状态,判断是否达到最优解或是否还能买全所有珠子。博主提到,使用int[256]存储珠子数量的方法可以实现快速解决,平均时间在十几毫秒内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题用 DFS 暴力搜索,对商店里的串挨个判断买或不买,状态是“当前已经买下的珠子,当前正犹豫买不买的串”。

做两个剪枝即可,一个最优性剪枝,一个可行性剪枝:当前需要额外购买的珠子个数已经超过了最优解时剪掉,当前选择已经不可能买全所有珠子时剪掉。

搜索前先做出一个预处理数组,储存第 i~n-1 个串包含的珠子情况。DFS 到达每个状态时,首先处理一遍已经买的珠子,得到已经额外买下的珠子数量,顺便判断一下是不是已经买齐,然后做那两个剪枝,再往下递归。

珠子数量我直接用 int[256] 存了,丢掉个常数优化应该没啥问题,还省点力气。这个搜索跑起来挺快的,十几ms就能AC。:P


#include <iostream>
using namespace std;
const int maxn = 105;
const int maxl = 1005;
const int INF = 0x3f3f3f3f;

int shop[maxn][256], need[256], have[256], rem[maxn][256];
int n, tot, extra = INF;
char s[maxl];

void dfs(int cur) {

  int ex = 0, lk = tot;
  for (int i = 0; i < 256; i++) {
    int t = min(need[i], have[i]);
    ex += have[i] - t;
    lk -= t;
  }

  if (cur == n) {
    if (!lk) extra = min(extra, ex);
    return;
  }

  if (ex >= extra) return;
  for (int i = 0; i < 256; i++) {
    if (have[i] + rem[cur][i] < need[i]) return;
  }

  for (int i = 0; i < 256; i++)
    have[i] += shop[cur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值