首页 > 代码库 > [HDU 3535] AreYouBusy (动态规划 混合背包)

[HDU 3535] AreYouBusy (动态规划 混合背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535

题意:有n个任务集合,需要在T个时间单位内完成。每个任务集合有属性,属性为0的代表至少要完成1个,属性为1的为至多完成1个,属性为2的为任意完成。

每个任务做完后都有个价值,问在T个时间单位内完成n个任务集合的任务获得的最大价值是多少?如果不能满足要求输出-1

 

首先先分析什么情况下输出-1:

因为属性为0的代表至少要完成1个,当遇到一个属性为0的任务集合里一个都无法完成的时候,输出-1.

其他的属性不予考虑,因为其中的每个任务都是可完成可不完成的。

 

那么问题就归结成为了:属性为0的,是一个分组背包,属性为1的是一个分组背包,属性为2的在组内是一个01背包。

 

这道题目的好处就是在于深入理解各种背包,我就是不太理解,所以刚开始就敲的各种挫,WA了好多次。

代码:

 1 import java.util.*; 2  3 public class Main{ 4     public static void main(String[] args){ 5         Scanner sc = new Scanner(System.in); 6         while( sc.hasNext() ){ 7             int n = sc.nextInt(); 8             int T = sc.nextInt(); 9             int [][][] c = new int[n+1][111][2];10             11             for(int i=1;i<=n;i++){12                 c[i][0][0] = sc.nextInt();13                 c[i][0][1] = sc.nextInt();14                 for(int j=1;j<=c[i][0][0];j++){15                     c[i][j][0] = sc.nextInt();16                     c[i][j][1] = sc.nextInt();17                 }18             }19             20             int dp[][] = new int[n+1][111];21             22             23             24             boolean flag = true;25             26             for(int i=1;i<=n;i++){27                 if( c[i][0][1]==0 ){28                     Arrays.fill(dp[i], -99999999);29                     for(int k=1;k<=c[i][0][0];k++){30                         for(int j=T;j>=c[i][k][0];j--){31                             dp[i][j] = Math.max(dp[i][j], Math.max(dp[i-1][j-c[i][k][0]]+c[i][k][1],dp[i][j-c[i][k][0]]+c[i][k][1]));32                         }33                     }34                     if( dp[i][T]<0 ) flag = false;35                 } else if( c[i][0][1] == 1 ){36                     for(int j=T;j>=0;j--){37                         dp[i][j] = dp[i-1][j];38                         for(int k=1;k<=c[i][0][0];k++){39                             if( j>=c[i][k][0]) dp[i][j] = Math.max(dp[i][j], dp[i-1][j-c[i][k][0]]+c[i][k][1]);40                         }41                     }42                 } else if( c[i][0][1] == 2 ){43                     for(int j=T;j>=0;j--){44                         dp[i][j] = dp[i-1][j];45                     }46                     for(int k=1;k<=c[i][0][0];k++){47                         for(int j=T;j>=c[i][k][0];j--){48                             dp[i][j] = Math.max(dp[i][j], dp[i][j-c[i][k][0]]+c[i][k][1]);49                         }50                     }51                 }52                 53             } // for i54             55             if( flag ) System.out.println(dp[n][T]);56             else System.out.println(-1);57             58         }59     }60 }

 

[HDU 3535] AreYouBusy (动态规划 混合背包)