UVA 10626 Buying Coke (记忆化)

地址:点击打开链接

题意:就是买一个售价8分的饮料,然后你有的硬币有1,5,10分三种。

然后问买c瓶饮料,一次一次买,你最小的投币次数。

我们可以有几种方法:1:投8个一分  2:投一个5分的3个1分的

3:投一个10分的找3个一分的 4:投一个10分的3个一分的,找一个5分的

还有其他方案但是不是太划算。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
typedef long long LL;
typedef pair<int,int>pil;
const int INF = 0x3f3f3f3f;
const int maxn=1100;
char str[maxn];
int dp[1100][155][55];
int n1,n2,n3,c;
int dfs(int num,int x1,int x2,int x3)//num,1,5,10
{
    if(num==0)  return 0;
    int &res=dp[x1][x2][x3];
    if(res!=-1)  return res;
    res=INF;
    if(x3>=1)  res=min(res,dfs(num-1,x1+2,x2,x3-1)+1);
    if(x2>=2)  res=min(res,dfs(num-1,x1+2,x2-2,x3)+2);
    if(x1>=8)  res=min(res,dfs(num-1,x1-8,x2,x3)+8);
    if(x1>=3&&x3>=1)  res=min(res,dfs(num-1,x1-3,x2+1,x3-1)+4);
    if(x1>=3&&x2>=1)  res=min(res,dfs(num-1,x1-3,x2-1,x3)+4);
    return res;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&c,&n1,&n2,&n3);
        CLEAR(dp,-1);
        printf("%d\n",dfs(c,n1,n2,n3));
    }
    return 0;
}
时间: 2024-10-11 22:17:40

UVA 10626 Buying Coke (记忆化)的相关文章

uva 10626 Buying Coke (DP记忆化搜索)

uva 10626 Buying Coke I often buy Coca-Cola from the vending machine at work. Usually I buy several cokes at once, since my working mates also likes coke. A coke in the vending machine costs 8 Swedish crowns, and the machine accept crowns with the va

uva 10626 Buying Coke (DP + 记忆化搜索)

Problem D Buying Coke Input: Standard Input Output: Standard Output Time Limit: 2 Seconds I often buy Coca-Cola from the vending machine at work. Usually I buy several cokes at once, since my working mates also likes coke. A coke in the vending machi

UVa 10626 Buying Coke(DP)

Problem D Buying Coke Input: Standard Input Output: Standard Output Time Limit: 2 Seconds I often buy Coca-Cola from the vending machine at work. Usually I buy several cokes at once, since my working mates also likes coke. A coke in the vending machi

uva10626 - Buying Coke(记忆话搜索)

题目:uva10626 - Buying Coke(记忆话搜索) 题目大意:给你3种价值的硬币, 1, 5, 10现在要求你取自动售卖机买可乐,一瓶可乐价值8,给你要求买的可乐的数目,和三种硬币的数目,问你最少需要投多少硬币.自动售卖机会根据你投入的钱来找零,可以的话找出的零钱硬币会最少. 解题思路: 这题之前没有想到可乐的已经购买瓶数是隐含在剩余的硬币情况中,换句话说就是你买了多少瓶可乐,不论用什么方式买,剩余的硬币的情况总能反映买了多少瓶可乐.所 以数组开3维就可以了.而且要注意还有 1 个

uva 10981 - String Morphing(记忆化+离散)

题目链接:uva 10981 - String Morphing 题目大意:给出一个规则,表示由两个字符可以变成一个字符(题目中的表),然后给出一个字符串A,问如何同过规则变换得到B串,输出过程. 解题思路:记忆化搜索,每次枚举当前串可以变换的位置,然后记录下来,用map映射设,有个剪枝就是找到B串就可以结束搜索了.然后在从B串回溯输出答案. #include <cstdio> #include <cstring> #include <iostream> #includ

UVA - 10118Free Candies(记忆化搜索)

题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每个糖果都有颜色.每次你都只能拿任意一堆最上面的糖果,放到自己的篮子里.如果有两个糖果颜色相同的话,就可以将这对糖果放进自己的口袋.自己的篮子最多只能装5个糖果,如果满了,游戏就结束了.问你能够得到的最多的糖果对数. 解题思路:这题想了好久,好不容易把状态想对了,结果脑子发热,又偏离了方向.dp[a][b][c][d]:四堆糖果现在在最上面的是哪一个.因为下面的糖果如果确定了,那么接下了不管你怎么取,最优

UVA 10626--Buying Coke+记忆化搜索+DP

题目链接:点击进入 原来定义状态dp[n][n1][n5][n10]表示购买n瓶可乐后剩余1,5,10分硬币n1,n5,n10个时花费硬币数最小的数量.然后状态转移是:1.8个一分硬币购买第n瓶可乐,t=dp[n-1][n1+8][n5][n10]+8; 2.一个五分和3个1分,t=dp[n-1][n1+3][n5+1][n10]+4; 3.两个5分t=dp[n-1][n1][n5+2][n10]; 4.一个10分,t=dp[n-1][n5][n10+1]. 对于第一二种dp[n][n1][n5

UVA 707 - Robbery(记忆化搜索)

UVA 707 - Robbery 题目链接 题意:在一个w * h的图上,t个时刻,然后知道一些信息,每个时刻没有小偷的矩阵位置,问哪些时刻可以唯一确定小偷位置,和确定小偷是否已经逃走,如果没逃走,但是也没有时刻可以可以确定小偷位置,就是不知到 思路:记忆化搜索,dp[x][y][ti]表示在x,y位置,ti时刻时候,小偷是否可能出现在这个位置,1表示有可能,0表示没可能,由于小偷一次最多只能上下左右走一步或者不走,所以去dfs一遍即可 最后判断的时候,如果有一个时刻没有一个1,就表示已经逃走

UVa 1629 Cake slicing (记忆化搜索)

题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃,问最少切割距离是多少. 析:很容易知道是记忆化搜索,我们用dp[u][d][l][r]来表示,上界是u,下界是d,左边是l,右边是r,然后不断切割,不过要注意切的时候是按缝隙切, 缝隙多一条,那么我们可以补上一条,用0来补齐,然后就进行计算就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #in