Ahui Writes Word
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2245 Accepted Submission(s): 824
Question: the maximum value Ahui can get.
Note: input words will not be the same.
Each of the next N line are a string and two integer, representing the word, the value(Vi ) and the complexity(Ci ). (0 ≤ Vi , Ci ≤ 10)
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 15;
const int INF = 0xfffffff;
const double eps = 1e-8;
const ll MOD = 1e9 + 7;
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define rep(c, a, b) for (ll c = a; c < b; c++)
#define nre(c, a, b) for (int c = a; c > b; c--)
int res[N][N], dp[11000];
void solve (int v, int c, int n, int m);
int main ()
{
int n, m;
while (scanf ("%d%d", &n, &m) != EOF)
{
met (res, 0); met (dp, 0);
char a[20]; int x, y;
while (n--)
{
scanf ("%s%d%d", a, &x, &y);
res[x][y]++;
}
rep (i, 1, 11){
rep (j, 1, 11) {
if (res[i][j])
solve (i, j, res[i][j], m);
}
}
printf ("%d\n", dp[m]);
}
return 0;
}
void solve (int v, int c, int n, int m)
{
for (int k=1; n>0; k<<=1) //二進制優化
{
if (k > n) k = n;
n -= k;
int vv = v * k, cc = c * k;
nre (j, m, cc-1) {
dp[j] = max (dp[j], dp[j-cc] + vv);
}
}
}