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;
}