uva 10118(DP)

来源:互联网 发布:mac怎么安装mpv 编辑:程序博客网 时间:2024/06/05 11:25

UVA 10118

题意:

有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果,

如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己的口袋里,问最多能拿走多少对糖果。糖果种类最多20种. 


思路:记忆化搜索

Orz:在输入的时候不小心写错了,导致一直调试。感觉自己的函数并没有问题,纠结了好久。

找出问题时瞬间想si


#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <queue>#include <vector>#include <algorithm>#include <functional>using namespace std;const int maxn = 50;int num[5];int tmap[maxn][maxn];int dp[maxn][maxn][maxn][maxn];bool vis[25];int n;int fin(int all){    if(dp[num[1]][num[2]][num[3]][num[4]] != -1)        return dp[num[1]][num[2]][num[3]][num[4]];    if(all == 5)        return dp[num[1]][num[2]][num[3]][num[4]] = 0;    int ans = 0;    for(int i= 1; i <= 4; i++)    {        if(num[i]> n)            continue;        if(vis[tmap[i][num[i]]])               //若篮子里面已经有一个        {            vis[tmap[i][num[i]]] = false;            num[i]+=1;            ans = max(fin(all-1) + 1,ans);            num[i]-=1;            vis[tmap[i][num[i]]] = true;        }        else        {            vis[tmap[i][num[i]]] = true;            num[i]+=1;            ans = max(fin(all+1),ans);            num[i]-=1;            vis[tmap[i][num[i]]] = false;        }    }    return dp[num[1]][num[2]][num[3]][num[4]] =ans;}int main(){    while(scanf("%d",&n) && n)    {        for(int j = 1; j <= n; j++)            for(int i = 1; i <=4; i++)                scanf("%d",&tmap[i][j]);        num[1] = num[2] = num[3] = num[4] = 1;        memset(dp,-1,sizeof(dp));        memset(vis,false,sizeof(vis));        printf("%d\n",fin(0));    }    return 0;}



0 0
原创粉丝点击