hdu1712(分组背包)

#include <iostream>
参考来自背包九讲之分组背包(注意三个循环的顺序,多重背包转换为01背包求解时,也有一定的顺序,否则则错)
#include <cstdio>
#include <string.h>
#define INF -999999
using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int m,n,j,i,t,s[150][150],dp[10010];
    while(scanf("%d%d",&n,&m),m,n)
    {
        for (i=1;i<=n;++i)
        for (j=1;j<=m;++j)
        scanf("%d",&s[i][j]);
        for (i=0;i<=m;++i)
        dp[i]=0;
        for (i=1;i<=n;++i)//分组考虑
        for (t=m;t>=1;--t)//倒叙保证了顶多选了一件
        for (j=1;j<=m;++j)
        if (t>=j)
        dp[t]=max(dp[t-j]+s[i][j],dp[t]);
        printf ("%d\n",dp[m]);
    }
    return 0;
}

 

posted @ 2013-04-29 14:54  一线添  阅读(161)  评论(0编辑  收藏  举报