Ahui Writes Word hdu3732 多重背包

http://acm.hdu.edu.cn/showproblem.php?pid=3732

好长时间没写题了。。

从前辈的博客里抄来的。。

/从题意上看明显是01背包,但是如果用01背包做肯定会超时,仔细看了下数据,每个单词的价值和复杂度只有0到10,最多有11*11种情况,所有可以看成是多重背包问题,用二维数组t来记录个数**/


自己的代码。

/*
 * hdu3732.cpp
 *
 *  Created on: 2013-4-12
 *      Author: DELL
 */

#include <iostream>
using namespace std;
#define N 14
#define MAX 100005
int word[N][N],value[MAX],size[MAX],rel[MAX];

int max(int a,int b){
	if (a>b)
		return a;
	return b;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif
	int n,c,v,lex,i,j,count,k;
	char s[N];
	while(scanf("%d%d",&n,&c)!=EOF){
		for (i=0;i<N;i++)
			for (j=0;j<N;j++)
				word[i][j]=0;
		for (i=0;i<n;i++){
			scanf("%s%d%d",s,&v,&lex);
			word[v][lex]++;
		}
		count=0;
		for (i=0;i<N;i++)
			for (j=0;j<N;j++){
				for (k=1;k<=word[i][j];k<<=1){
					value[count]=k*i;
					size[count++]=k*j;
					word[i][j]-=k;
				}
				if (word[i][j]>0){
					value[count]=word[i][j]*i;
					size[count++]=word[i][j]*j;
				}
			}
		memset(rel,0,sizeof(rel));
		for (i=0;i<count;i++)
			for (j=c;j>=size[i];j--)
				rel[j]=max(rel[j],rel[j-size[i]]+value[i]);
		printf("%d\n",rel[c]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值