习题9-2(免费糖果)【深搜dfs】+【记忆化搜索】

本篇博客介绍了如何解决UVa 10118题目的免费糖果问题,通过深搜(DFS)和记忆化搜索策略,探讨如何帮助佳佳拿到最多的糖果。博主分享了详细的解题思路,包括使用DP数组记录不同状态下的最优解,并利用辅助数组h来标记糖果颜色的存在情况。同时,博主还反思了在编程过程中遇到的错误,如思维定势导致的代码错误,以此提醒读者在编程时要细心检查。
摘要由CSDN通过智能技术生成

习题9-2

【UVa 10118】Free Candies(免费糖果)

题目大意:

桌上有4堆糖果,每堆有N(N<=40)颗。佳佳有个最多可以装5颗糖果的小篮子。他每次选择一堆糖果,把最顶上的一颗拿到篮子里。如果篮子里有两颗颜色相同的糖果,佳佳就把他们从篮子里拿出来放到自己口袋里。如果篮子满了而里面又没有相同颜色的糖果,游戏结束,口袋里的糖果就归他了。当然,如果佳佳够聪明,他有可能把堆里的所有糖果都拿走。为了拿到尽量多的糖果,佳佳该怎么做呢?

思路:

大概就是模拟着取糖果的步骤进行深搜,穷举结果并保存到dp数组中,dp[a][b][c][d]表示取了第一堆a个,第二堆b个,第三堆c个,第四堆d个的状态得到的最优解,具体过程见代码,其中注释蛮全的:-D;

tips:细节方面一开始“有两颗颜色相同的糖果”这里卡住了,看了一下题解,可以用一个h数组(以颜色的代码为下标)保存每个颜色的存在与否,因为每个颜色在篮子中的状态只有1个或0个两种,故用true和false表示。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 50

int n,t[N][5],dp[N][N][N][N],top[5];
bool<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值