zoukankan      html  css  js  c++  java
  • hdu4501——小明系列故事——买年货(多维背包)

    题解:

    思路:将v1,v2,k都当作一种体积,开三维dp数组,每种物品只能取一次

    代码中的for循环是倒着进行的,知道01背包和完全背包的肯定明白,倒着进行的就代表每种物品只选择一次

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn=105;
     7 const int INF=0x3f3f3f3f;
     8 int dp[maxn][maxn][6];
     9 struct shudui
    10 {
    11     int a,b,val;
    12 } m[maxn];
    13 int main()
    14 {
    15     int n,v1,v2,k1;
    16     while(~scanf("%d%d%d%d",&n,&v1,&v2,&k1))
    17     {
    18         for(int i=1; i<=n; ++i)
    19         {
    20             scanf("%d%d%d",&m[i].a,&m[i].b,&m[i].val);
    21         }
    22         memset(dp,0,sizeof(dp));
    23         for(int l=1; l<=n; ++l)
    24         {
    25             for(int i=v1; i>=0; --i)
    26             {
    27                 for(int j=v2; j>=0; --j)
    28                 {
    29                     for(int k=k1; k>=0; --k)
    30                     {
    31                         int temp=0;
    32                         if(i-m[l].a>=0)
    33                             temp=max(temp,dp[i-m[l].a][j][k]+m[l].val);
    34                         if(j-m[l].b>=0)
    35                             temp=max(temp,dp[i][j-m[l].b][k]+m[l].val);
    36                         if(k>0)
    37                             temp=max(temp,dp[i][j][k-1]+m[l].val);
    38                             dp[i][j][k]=max(dp[i][j][k],temp);
    39                     }
    40                 }
    41             }
    42         }
    43         printf("%d
    ",dp[v1][v2][k1]);
    44     }
    45     return 0;
    46 }
    View Code

    其实感觉多维背包也是一种套路,主要是找到dp的维度

  • 相关阅读:
    Codeforces899D Shovel Sale(思路)
    F
    Codeforces909D Colorful Points(缩点)
    LOD
    Instruments
    IO优化
    Unity JobSystem
    Android 设备指纹
    帧同步
    寻路
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11189487.html
Copyright © 2011-2022 走看看