zoukankan      html  css  js  c++  java
  • HDU 5234 DP背包

    题意:给一个n*m的矩阵,每个点是一个蛋糕的的重量,然后小明只能向右,向下走,求在不超过K千克的情况下,小明最终能吃得最大重量的蛋糕。

    思路:类似背包DP;

    状态转移方程:dp[i][j][k]----在i,j位置时,最大容量为k时的最大值;

    做背包循环一般从1开始,因为需要坐标-1的情况,从0开始需要特判,而且容易RE;

     1 #include <iostream>
     2 #include <cmath>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cstdlib>
     6 #include <string>
     7 #include <sstream>
     8 #include <algorithm>
     9 #define Max 2147483647
    10 #define INF 0x7fffffff
    11 #define N 110
    12 #define ll long long
    13 #define mem(a,b) memset(a,b,sizeof(a))
    14 #define repu(i, a, b) for(int i = (a); i < (b); i++)
    15 const double PI=-acos(-1.0);
    16 using namespace std;
    17 int dp[N][N][N];
    18 int w[N][N];
    19 int main()
    20 {
    21     int n,m,k;
    22     while(~scanf("%d%d%d",&n,&m,&k))
    23     {
    24         repu(i,0,1+n)
    25         repu(j,0,m+1)
    26         repu(p,0,k+1)
    27         dp[i][j][p] = 0;
    28         repu(i,1,1+n)
    29         repu(j,1,1+m)
    30         scanf("%d",&w[i][j]);
    31         repu(i,1,n+1)
    32         {
    33             repu(j,1,m+1)
    34             {
    35                 for(int p = w[i][j]; p<=k; p++)
    36                 {
    37                     int t = max(dp[i-1][j][p],dp[i][j-1][p]);///左边,上边
    38                     int s = max(dp[i-1][j][p-w[i][j]]+w[i][j],dp[i][j-1][p-w[i][j]]+w[i][j]);
    39                     dp[i][j][p] = max(t,s);
    40                 }
    41             }
    42         }
    43         int maxn = 0;
    44         repu(p,0,k+1)
    45         maxn = max(dp[n][m][p],maxn);
    46         printf("%d
    ",maxn);
    47     }
    48     return 0;
    49 }
    背包
  • 相关阅读:
    基于雪花算法的单机版
    Spring cloud gateway自定义filter以及负载均衡
    logback转义符与MDC
    录音地址文件保存
    maven加载本地jar
    ES Log4J配置信息
    java线程池
    openstreetmap的数据下载
    php更新版本后(路径更改后)要做的调整
    重启IIS
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4540103.html
Copyright © 2011-2022 走看看