HDU - 3535:AreYouBusy (分组背包)

Posted hua-dong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 3535:AreYouBusy (分组背包)相关的知识,希望对你有一定的参考价值。

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

思路:分三类各自求即可。0的时候必须更新,1的时候最多更新一次,2的时候正常01背包。

#include<bits/stdc++.h>
#define s first
#define e second
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
using namespace std;
const int maxn=110;
const int inf=1e9;
int dp[maxn],tmp[maxn],c[maxn],g[maxn],T,M;
void solve0() //at least

    rep(i,0,T) tmp[i]=-inf;
    rep(i,1,M)
      rep2(j,T,c[i])
        tmp[j]=max(tmp[j],max(dp[j-c[i]]+g[i],tmp[j-c[i]]+g[i]));
    
    rep(i,0,T) dp[i]=tmp[i];

void solve1() //at most

    rep(i,0,T) tmp[i]=dp[i];
    rep(i,1,M)
      rep2(j,T,c[i])
        dp[j]=max(tmp[j-c[i]]+g[i],dp[j]);

void solve2() //free

    rep(i,1,M)
      rep2(j,T,c[i])
        dp[j]=max(dp[j-c[i]]+g[i],dp[j]);

int main()

    int N,S,ans;
    while(~scanf("%d%d",&N,&T))
        memset(dp,0,sizeof(dp));
        ans=-1;
        rep(i,1,N)
            scanf("%d%d",&M,&S);
            rep(j,1,M) scanf("%d%d",&c[j],&g[j]);
            if(S==0) solve0();
            if(S==1) solve1();
            if(S==2) solve2();
        
        ans=max(ans,dp[T]);
        printf("%d\n",ans);
    
    return 0;

 

以上是关于HDU - 3535:AreYouBusy (分组背包)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3535 AreYouBusy(组合背包)

hdu_3535 (AreYouBusy)

HDU 3535 AreYouBusy (混合背包)

HDU 3535 分组混合背包

hdu 3535 分组背包

AreYouBusy (混合背包)