hdu 5234 Happy birthday【dp】【三维0-1背包】

22 篇文章 1 订阅

Happy birthday

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 753    Accepted Submission(s): 349


Problem Description
Today is Gorwin’s birthday. So her mother want to realize her a wish. Gorwin says that she wants to eat many cakes. Thus, her mother takes her to a cake garden.

The garden is splited into n*m grids. In each grids, there is a cake. The weight of cake in the i-th row j-th column is wij kilos, Gorwin starts from the top-left(1,1) grid of the garden and walk to the bottom-right(n,m) grid. In each step Gorwin can go to right or down, i.e when Gorwin stands in (i,j), then she can go to (i+1,j) or (i,j+1) (However, she can not go out of the garden).

When Gorwin reachs a grid, she can eat up the cake in that grid or just leave it alone. However she can’t eat part of the cake. But Gorwin’s belly is not very large, so she can eat at most K kilos cake. Now, Gorwin has stood in the top-left grid and look at the map of the garden, she want to find a route which can lead her to eat most cake. But the map is so complicated. So she wants you to help her.
 


Input
Multiple test cases (about 15), every case gives n, m, K in a single line.

In the next n lines, the i-th line contains m integers wi1,wi2,wi3,wim which describes the weight of cakes in the i-th row

Please process to the end of file.

[Technical Specification]

All inputs are integers.

1<=n,m,K<=100

1<= wij <=100
 


Output
For each case, output an integer in an single line indicates the maximum weight of cake Gorwin can eat.
 


Sample Input
  
  
1 1 2 3 2 3 100 1 2 3 4 5 6
 


Sample Output
  
  
0 16
Hint
In the first case, Gorwin can’t eat part of cake, so she can’t eat any cake. In the second case, Gorwin walks though below route (1,1)->(2,1)->(2,2)->(2,3). When she passes a grid, she eats up the cake in that grid. Thus the total amount cake she eats is 1+4+5+6=16.


看见题目知道是0-1背包问题,不能只吃一部分,要么吃了这个蛋糕,要么就不吃,典型的0-1背包的限制条件,但是这里比一维0-1背包多了两个维度~

0-1背包的动态规划转移方程是:

dp[j]=max(dp[j],dp[j-a[i].cost]+a[i].val);

这里三维的0-1背包的动态规划转移方程是:

dp[i][j][k]=max(dp[i][j][k],max(dp[i-1][j][k-a[i][j]]+a[i][j],dp[i][j-1][k-a[i][j]]+a[i][j]));

因为这是在行走过程中的dp【i】【j】【k】,所以这里的dp【i】【j】【k】要先从dp【i-1】【j】【k】,dp【i】【j-1】【k】中挑选大的值,再和max(dp[i-1][j][k-a[i][j]]+a[i][j],dp[i][j-1][k-a[i][j]]+a[i][j])比较。

这里直接上AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define ll long long int
int  a[105][105];
int  dp[105][105][105];
int main()
{
    int n,m,v;
    while(~scanf("%d%d%d",&n,&m,&v))
    {
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                for(int k=v;k>=a[i][j];k--)
                {
                    dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k]);
                    dp[i][j][k]=max(dp[i][j][k],max(dp[i-1][j][k-a[i][j]]+a[i][j],dp[i][j-1][k-a[i][j]]+a[i][j]));
                }
            }
        }
        printf("%d\n",dp[n][m][v]);
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值