3732 Ahui Writes Word

// N个物品 放进容量为C的背包里面 要求价值最大
// 一看 第一反应是0 1背包 不过 N=100000 C=10000
// 注意到 v,c在 10以内
// 那么 最多就100种组合了 然后就转化为 多重背包了
// dp
#include <iostream> #include <string> #include <map> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> #include <vector> using namespace std; #define MOD 1000000007 #define maxn 10010 int dp[maxn]; int mp[110][110]; // v,c char str[110]; //int use[maxn*10]; int main(){ int i,j,k; int n,c; int u,v; while(scanf("%d %d",&n,&c)!=EOF){ memset(mp,0,sizeof(mp)); for(i=0;i<n;i++){ scanf("%s %d %d",str,&u,&v); // printf("%s "); mp[u][v]++; } for(i=0;i<=c;i++) dp[i]=0; int tp; for(u=0;u<=10;u++) for(v=0;v<=10;v++){ if(mp[u][v]){ k=1; while(mp[u][v]>=k){ tp=k*v; for(j=c;j>=tp;j--) if(dp[j]<dp[j-tp]+k*u) dp[j]=dp[j-tp]+k*u; mp[u][v]-=k; k=k<<1; } if(mp[u][v]){ k=mp[u][v]; tp=k*v; for(j=c;j>=tp;j--) if(dp[j]<dp[j-tp]+k*u) dp[j]=dp[j-tp]+k*u; } } } printf("%d\n",dp[c]); } return 0; }

 

你可能感兴趣的:(write)