hdu 1712 ACboy needs your help(分组01背包)

#include <stdio.h>
#include <string.h>

 

#define MAXN 10005
#define MAXM 105

struct GNode
{
    int weight;
    int value;
};
GNode group[MAXN][MAXN];
int M, len[MAXN];
int f[MAXN];

inline int getMax(int a, int b) { return a > b ? a : b; }
void dp(const int K)
{
    memset(f, 0, sizeof(f));
    int i, j, k;
    for(k = 1; k <= K; k++)
    {
        for(j = M; j >= 0; j--)
        {
            for(i = 0; i < len[k]; i++)
            {
                if(j >= group[k][i].weight)
                {
                    f[j] = getMax(f[j], f[j - group[k][i].weight] + group[k][i].value);
                }
            }
        }
    }
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("indata.txt", "r", stdin);
    #endif
    int N;
    while(scanf("%d %d", &N, &M), N + M)
    {
        memset(len, 0, sizeof(len));
        int i, j;
        for(i = 1; i <= N; i++)
        {
            for(j = 1; j <= M; j++)
            {
                int v;
                scanf("%d", &v);
                group[i][len[i]].weight = j;
                group[i][len[i]++].value = v;
            }
        }
     /* for(i = 1; i <= N; i++)
      {
          for(j = 0; j < len[i]; j++)
          {
              printf("(%d %d %d) ", i, group[i][j].weight, group[i][j].value);
          }
          printf("\n");
      }
      printf("\n");*/

        dp(N);
        printf("%d\n", f[M]);
    }
    return 0;
}

posted @ 2010-10-22 12:34  菜到不得鸟  阅读(125)  评论(0)    收藏  举报