zoukankan      html  css  js  c++  java
  • hdu3535 (分组背包,最少选一 + 最多选一 + 随意)

    题意:

    给你n种工作,给你T的时间去做它们。给你m和s,说明这种工作有m件事可以做,它们是s类的工作(s=0,1,2,s=0说明这m件事中最少得做一件,s=1说明这m件事中最多只能做一件,s=2说明这m件事你可以做也可以不做)。再给你ci和gi代表你做这件事要用ci的时间,能获得gi的快乐值。求在T的时间内你能获得的最大快乐值。

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

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <vector>
     4 #include <cstring>
     5 using namespace std;
     6 const int Ni = 120;
     7 int dp[Ni][Ni];
     8 int main()
     9 {
    10     int n,m,i,j,k,num,c,v,typ;
    11     while(~scanf("%d%d",&n,&m))
    12     {
    13         memset(dp,0,sizeof(dp));
    14         for(i=1;i<=n;i++)
    15         {
    16             scanf("%d%d",&num,&typ);
    17             if(typ==0) for(int p=0;p<=m;p++) dp[i][p]=-1;//如果不选就为-1
    18             else for(int p=0;p<=m;p++) dp[i][p]=dp[i-1][p];//把上一个包的值传递下去
    19             for(j=1;j<=num;j++)
    20             {
    21                 scanf("%d%d",&c,&v);
    22                 for(k=m;k>=c;k--)
    23                 {
    24                     if(typ==0)//最少选一个
    25                     {
    26                         if(dp[i][k-c]!=-1)//前面有必选的没选,不能再选
    27                         dp[i][k]=max(dp[i][k],dp[i][k-c]+v);
    28 
    29                         if(dp[i-1][k-c]!=-1)
    30                         dp[i][k]=max(dp[i][k],dp[i-1][k-c]+v);
    31 
    32                     }
    33                     else if(typ==1)//最多选一个
    34                     {
    35                         if(dp[i-1][k]!=-1)
    36                         dp[i][k]=max(dp[i][k],dp[i-1][k]);
    37 
    38                         if(dp[i-1][k-c]!=-1)
    39                         dp[i][k]=max(dp[i][k],dp[i-1][k-c]+v);
    40 
    41                     }
    42                     else //随意
    43                     {
    44                         if(dp[i-1][k]!=-1)
    45                         dp[i][k]=max(dp[i][k],dp[i-1][k]);
    46 
    47                         if(dp[i][k-c]!=-1)
    48                         dp[i][k]=max(dp[i][k],dp[i][k-c]+v);
    49 
    50                         if(dp[i-1][k-c]!=-1)
    51                         dp[i][k]=max(dp[i][k],dp[i-1][k-c]+v);
    52 
    53                     }
    54                 }
    55             }
    56         }
    57         printf("%d\n",dp[n][m]);
    58     }
    59     return 0;
    60 }
    3 3
    2 1
    2 5
    3 8
    2 0
    1 0
    2 1
    3 2
    4 3
    2 1
    1 1

    3 4
    2 1
    2 5
    3 8
    2 0
    1 1
    2 8
    3 2
    4 4
    2 1
    1 1

    1 1
    1 0
    2 1

    5 3
    2 0
    1 0
    2 1
    2 0
    2 2
    1 1
    2 0
    3 2
    2 1
    2 1
    1 5
    2 8
    3 2
    3 8
    4 9
    5 10
    ans:
    5
    13
    -1
    -1
  • 相关阅读:
    探讨变量的内存分配方式
    色彩之RGB和灰阶
    Perl语言:qw简写
    【转】位操作
    [转]Perl学习笔记
    Spaghetti code&Ravioli code&Lasagna code&Spaghetti with meatballs
    交叉编译lsusb
    GCC,LLVM,Clang编译器对比
    如何判断自己是否到了该辞职的时候
    Javascript Array和String的互转换。
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2636601.html
Copyright © 2011-2022 走看看