hdu 1712 分组背包入门

对于每门课程,学习的时间不同,收获也不同,在一门课程上花费了两个不同的时间去学习是互斥的,即它们是属于同一个组内的物品,直接做分组背包即可。

需要注意三重循环的顺序不可变!

 1 #include <iostream>

 2 #include <cstring>

 3 #include <cstdio>

 4 using namespace std;

 5 

 6 const int INF = -99999999;

 7 const int N = 101;

 8 int a[N][N];

 9 int dp[N];

10 int n, m;

11 

12 int main ()

13 {

14     while ( scanf("%d%d", &n, &m) != EOF )

15     {

16         if ( n == 0 && m == 0 ) break;

17         for ( int i = 1; i <= n; i++ )

18         {

19             for ( int j = 1; j <= m; j++ )

20             {

21                 scanf("%d", &a[i][j]);

22             }

23         }

24         memset( dp, 0, sizeof(dp) );

25         for ( int i = 1; i <= n; i++ )

26         {

27             for ( int j = m; j > 0; j-- )

28             {

29                 for ( int k = 1; k <= j; k++ )

30                 {

31                     dp[j] = max( dp[j], dp[j - k] + a[i][k] );

32                 }

33             }

34         }

35         printf("%d\n", dp[m]);

36     }

37     return 0;

38 }

注:没有要求必须用够m天,即背包可以不满。

你可能感兴趣的:(HDU)