【混合分组背包】——hdu3535——批量处理(★)

                                     AreYouBusy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3944    Accepted Submission(s): 1567


Problem Description
Happy New Term!
As having become a junior, xiaoA recognizes that there is not much time for her to AC problems, because there are some other things for her to do, which makes her nearly mad.
What's more, her boss tells her that for some sets of duties, she must choose at least one job to do, but for some sets of things, she can only choose at most one to do, which is meaningless to the boss. And for others, she can do of her will. We just define the things that she can choose as "jobs". A job takes time , and gives xiaoA some points of happiness (which means that she is always willing to do the jobs).So can you choose the best sets of them to give her the maximum points of happiness and also to be a good junior(which means that she should follow the boss's advice)?
 

 

Input
There are several test cases, each test case begins with two integers n and T (0<=n,T<=100) , n sets of jobs for you to choose and T minutes for her to do them. Follows are n sets of description, each of which starts with two integers m and s (0<m<=100), there are m jobs in this set , and the set type is s, (0 stands for the sets that should choose at least 1 job to do, 1 for the sets that should choose at most 1 , and 2 for the one you can choose freely).then m pairs of integers ci,gi follows (0<=ci,gi<=100), means the ith job cost ci minutes to finish and gi points of happiness can be gained by finishing it. One job can be done only once.
 

 

Output
One line for each test case contains the maximum points of happiness we can choose from all jobs .if she can’t finish what her boss want, just output -1 .
 

 

Sample Input
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
1 5
3 2
0 1
0 2
1 2
0 2
1 1
2 0
3 2
2 1
2 1
1 5
2 8
3 2
3 8
4 9
5 10
 

 

Sample Output
5
13
-1
-1
 
 
题意:
有0,1,2三种任务,0任务中的任务至少得完成一件,
1中的任务最多完成1件,2中的任务随便做。
每一个任务最多只能做一次 。
n代表有n组任务,t代表有t分钟,m代表这组任务有m个子任务,s代表这m个子任务属于0,1,2中的哪种类型,
接下来是m个子任务,第一个数代表要花费的时间,第二个数代表得到的愉悦度
求在可以完成工作的情况的最大愉悦度
要是不能完成,输出-1(题意要求每个子任务只能被取一次)
 
思路:
题目给出的n组任务是有其固定顺序,只能是按照它给出来的解决问题
那么就一批一批的处理给出的问题
 
代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int c[105];
int g[105];
int dp[105][105];//dp[i][j]代表第 i 组,容量为 j 时的最大高兴值

int main()
{
    int n,t;
    while(cin>>n>>t)
    {
        memset(dp,-1,sizeof(dp));
        memset(dp[0],0,sizeof(dp[0]));

        int m,type;
        for(int i=1;i<=n;i++)
        {
            cin>>m>>type;

            for(int j=0;j<m;j++)
                cin>>c[j]>>g[j];

            if(type==0)
            {
                for(int k=0;k<m;k++)
                    for(int j=t;j>=c[k];j--)
                {
                    if(dp[i][j-c[k]]!=-1)
                        dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);
                    if(dp[i-1][j-c[k]]!=-1)
                        dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);
                }
            }

            else if(type==1)
            {
                for(int k=0;k<=t;k++)dp[i][k]=dp[i-1][k];

                for(int k=0;k<m;k++)
                    for(int j=t;j>=c[k];j--)
                        if(dp[i-1][j-c[k]]!=-1)
                            dp[i][j]=max(dp[i][j],dp[i-1][j-c[k]]+g[k]);
            }

            else if(type==2)
            {
                for(int k=0;k<=t;k++)dp[i][k]=dp[i-1][k];

                for(int k=0;k<m;k++)
                    for(int j=t;j>=c[k];j--)
                        if(dp[i][j-c[k]]!=-1)//前一状态可达
                            dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k]);
            }
        }
        cout<<dp[n][t]<<endl;
    }
    return 0;
}

 

posted @ 2016-08-23 15:26  琥珀川||雨露晨曦  阅读(97)  评论(0)    收藏  举报