习题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<