zoukankan      html  css  js  c++  java
  • hdu 5234 Happy birthday 背包 dp

    Happy birthday

    Time Limit: 20 Sec  Memory Limit: 256 MB

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=5234

    Description

    今天是Gorwin的生日。所以她的妈妈要实现她的一个愿望。Gorwin说她想吃很多蛋糕。所以他妈妈带她来到了蛋糕园。 这个园子被分成了n*m个方格子。在每一个格子里面,有一个蛋糕。第i行,第j列的格子中有一个重量为wij千克的蛋糕,Gorwin从左上角(1,1)的格子开始走,走到右下角(n,m)的格子。在每一步中,Gorwin可以向右或者向下走,即是:Gorwin站在(i,j)的时候,她可以走向(i+1,j)或者(i,j+1) (然而她不能走出这个花园)。 当Gorwin到达一个格子的时候,她可以把那个格子里面的蛋糕吃完或者不吃。但是,她不能只吃一部分。她的胃不是那么大,所以她最多只能吃K千克的蛋糕。现在,Gorwin站在左上角,她在看蛋糕园的地图,想要找出一条路,能够使得她吃到的蛋糕最多的一条路。请你来帮帮忙。

    Input

    多组测试数据(大概15组), 每一组数据在一行中给出n, m, K.
    在接下来n行中,第i行有m个整数wi1,wi2,wi3,⋯wim,代表第i行m个蛋糕的重量。
    请处理到文件末尾。

    [参数约定]
    所有输入均为整数。
    1<=n,m,K<=100
    1<= wij <=100

    Output

    对于每一个数据,输出一个值,代表Gorwin最多能吃到的蛋糕重量。

    Sample Input

    1 1 2 3 2 3 100 1 2 3 4 5 6

    Sample Output

    0 16

    HINT

     在第一组数据中,Gorwin不能吃蛋糕的一部分,所以她不能吃掉任何蛋糕。 在第二个数据中,Gorwin按照以下路径行走(1,1)->(2,1)->(2,2)->(2,3) 当她通过一个格子的时候,就把那个格子里面的蛋糕吃光。这样她吃的总重量就是1+4+5+6=16。

    题意

    题解:

    背包DP,dp[i][j][k]表示在i,j位置,容量为k的最大值

    然后就转移转移就好了!

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 200001
    #define mod 10007
    #define eps 1e-9
    int Num;
    char CH[20];
    //const int inf=0x7fffffff;   //нчоч╢С
    const int inf=0x3f3f3f3f;
    /*
    
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    */
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void P(int x)
    {
        Num=0;if(!x){putchar('0');puts("");return;}
        while(x>0)CH[++Num]=x%10,x/=10;
        while(Num)putchar(CH[Num--]+48);
        puts("");
    }
    //**************************************************************************************
    
    int g[110][110];
    int dp[110][110][110];
    int main()
    {
        //freopen("test.txt","r",stdin);
        int n,m,k;
        while(scanf("%d%d%d",&n,&m,&k)!=EOF)
        {
            memset(dp,0,sizeof(dp));
            memset(g,0,sizeof(g));
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    g[i][j]=read();
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    for(int t=g[i][j];t<=k;t++)
                    {
                        dp[i][j][t]=max(dp[i][j][t],max(dp[i-1][j][t],dp[i-1][j][t-g[i][j]]+g[i][j]));
                        dp[i][j][t]=max(dp[i][j][t],max(dp[i][j-1][t],dp[i][j-1][t-g[i][j]]+g[i][j]));
                        ans=max(ans,dp[i][j][t]);
                    }
                    for(int t=0;t<=k;t++)
                    {
                        dp[i][j][t]=max(dp[i][j][t],max(dp[i-1][j][t],dp[i][j-1][t]));
                        ans=max(ans,dp[i][j][t]);
                    }
                }
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    SQL Server 中,将多行转换为一行,用某个符号隔开的SQL 语句
    JQ 轻松学会$.get(),$.post(),$ajax()的作用和用法
    Dynamics 365 组织服务查询时,关于输入时间和输出时间的时区问题讲解
    在Dynamics 365的标准窗体,lookup字段变成了[Object Object],picklist直接展示数字
    C# 回顾正则表达式的常用语法
    观洛马琴科对决洛佩兹比赛有感
    读取硬盘序列号
    delphi 数组复制利用CopyMemory 最为完美
    MFC多线程通讯--自定义消息
    MFC 多线程及线程同步
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4525069.html
Copyright © 2011-2022 走看看