HDU 3732 Ahui Writes Word

这题乍一看是01背包水题,其实一看数据,明显直接01背包是过不了的,  再看那个V-C的范围是0-10    很明显,可能的搭配数最多也就121种

那么我就开一个数组记录下各种搭配的数量,用多重背包过


#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[10005];
char s[15];
int v, c, data[11][11], m;
void deal(int vi,int w,int num)
{
    int i, j, k;
    k=1;
    while(k<num)
    {
        for(j=m;j>=k*w;j--)
            dp[j]=max(dp[j],dp[j-k*w]+k*vi);
        num-=k;
        k*=2;
    }
    for(i=m;i>=num*w;i--)
        dp[i]=max(dp[i],dp[i-num*w]+num*vi);
}
int main()
{
    int n, i, j;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(dp,0,sizeof(dp[0])*(m+1));
        memset(data,0,sizeof(data));
        for(i=0; i<n; i++)
        {
            scanf("%s%d%d",s,&v,&c);
            data[v][c]++;
        }
        for(i=1;i<=10;i++)
        {
            for(j=0;j<=10;j++)
            {
                if(data[i][j]>0)
                    deal(i,j,data[i][j]);
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}


posted @ 2013-08-24 09:03  Ink_syk  阅读(84)  评论(0编辑  收藏  举报