hdu 3732(多重背包)

 

/*

     基础多重背包题

     比较有价值的就  “ 二分制压缩 ” 了,将每个个数长度num压缩成log(num)



*/



#include <cstdio>

#include <cstring>

struct One

{

	int v;

	int c;

};

One peo[100001];



int hash[15][15];

int dp[100005];



int max( int a, int b)

{

	return a > b ? a : b;

}

int main()

{

	int i,j,n,c,num;

	int temp_val,temp_col,count,sum,temp_sum;

	char s[50];

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

	{

		num=0;

		memset( hash, 0, sizeof( hash));

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



		for ( i = 0; i < n; i++)

		{

			scanf( "%s%d%d", s, &temp_val, &temp_col);

			if(hash[temp_val][temp_col] == 0)

			{

				peo[num].v = temp_val;

				peo[num].c = temp_col;

				num++;

			}

			hash[temp_val][temp_col] ++;

		}

		for( i = 0; i < num; i++)

		{

			count=1;

			sum=0;

			temp_sum = hash[peo[i].v][peo[i].c];

			while(sum < temp_sum)

			{

				for( j = c; j - count * peo[i].c >= 0; j--)

				{

					dp[j] = max (dp[j] , dp[j - count * peo[i].c] + count * peo[i].v);

				}

				sum += count;

				if(temp_sum - sum < count * 2)

					count = temp_sum - sum;

				else

					count *= 2;

			}

		}	

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

	}

	return 0;

}

 

你可能感兴趣的:(HDU)