Ahui Writes Word hdu3732 多重背包

来源:互联网 发布:windows组件中没有ie 编辑:程序博客网 时间:2024/05/01 10:07

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 100005int 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_JUDGEfreopen("in.txt","r",stdin);#endifint 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;}


原创粉丝点击