锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include <stdio.h>
#define N 2001
#define inf 10000000
#define max(a,b) ((a)>(b)?(a):(b))
int f[N][N],q[N],id[N];
int main()
{
int t,n,maxp,w,ap,bp,as,bs;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&maxp,&w);
for(int i=0;i<n;++i)
{
scanf("%d%d%d%d",&ap,&bp,&as,&bs);
for(int j=0;j<=maxp;++j)f[i][j]=-inf;
if(i<=w)for(int j=0;j<=as;++j)f[i][j]=-ap*j;
if(i>0)for(int j=0;j<=maxp;++j)f[i][j]=max(f[i][j],f[i-1][j]);
if (i==0||i<=w) continue;
for(int j=0,l=0,r=-1;j<=maxp;++j)
{
int tmp=f[i-w-1][j]+j*ap;
while(l<=r&&q[r]<tmp)--r;
q[++r]=tmp,id[r]=j;
while(l<=r&&id[l]+as<j)++l;
f[i][j]=max(f[i][j],q[l]-j*ap);
}
for(int j=maxp,l=0,r=-1;j>=0;--j)
{
int tmp=f[i-w-1][j]+j*bp;
while(l<=r&&q[r]<tmp)--r;
q[++r]=tmp,id[r]=j;
while(l<=r&&id[l]-bs>j)++l;
f[i][j]=max(f[i][j],q[l]-j*bp);
}
}
int ans=0;
for(int i=0;i<=maxp;++i)ans=max(ans,f[n-1][i]);
printf("%d\n",ans);
}
return 0;
}
#include <stdio.h>
#include <algorithm>
using namespace std;
int cas,tim,n,x,y,a[60],b[60],f[210];
int main()
{
scanf("%d",&cas);
for(int tim=0;tim<cas;)
{
scanf("%d%d%d",&n,&x,&y);
for(int i=1;i<=n;i++)//涓嬫爣閲?寮濮?nbsp;
scanf("%d%d",&a[i],&b[i]);
int l=0,r=a[1]*x+b[1]*y,m;
while(l<=r)
{
m=(l+r)>>1;
for(int i=1;i<=x;i++)f[i]=-999999999;
f[0]=0;
for(int i=1;i<=n;i++)
for(int v=x;v>=0;v--)
{
f[v]+=m/b[i];//鏂板叆宸ヤ漢瑕佹洿鏂?nbsp;
for(int j=0;j<v;j++) if (m>=(v-j)*a[i])
f[v]=max(f[v],f[j]+(m-a[i]*(v-j))/b[i]);
}
if(f[x]>=y)r=m-1;//鏈宸﹂艱繎
else l=m+1;
}
printf("Case %d: %d\n",++tim,l);
}
return 0;
}
#include <stdio.h>
#include <string.h>
int dp[101][6][160];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int m, k;
while (scanf("%d%d", &m, &k), m || k) {
memset(dp, 0, sizeof (dp));
int n = 1 << k, ans = 0, a;
for (int i = 1; i <= m; i++) {
scanf("%d", &a);
a--;
for (int j = 0; j < k; j++)
for (int s = 0; s < n; s++)
if ((s >> a)&1) {
if (a == j) dp[i][j][s] = max(dp[i][j][s], dp[i - 1][j][s] + 1);
else dp[i][j][s] = max(dp[i][j][s], dp[i - 1][j][s]);
} else {
dp[i][a][s | (1 << a)] = max(dp[i][a][s | (1 << a)], dp[i - 1][j][s] + 1);
dp[i][j][s] = max(dp[i][j][s], dp[i - 1][j][s]);
}
}
for (int i = 0; i < k; i++)
for (int j = 0; j < n; j++)
ans = max(ans, dp[m][i][j]);
printf("%d\n", m - ans);
}
return 0;
}
#include <string.h>
const int N = 1 << 11;
long long x[N], y[N];
int n, m, t;
bool check(int x) {
while (x) {
if (x & 1) {
x >>= 1;
if (x & 1)x >>= 1;
else return 0;
} else x >>= 1;
}
return 1;
}
bool judge(int now, int last) {
int tmp = t & (~last);
if ((now & tmp) == tmp && check(now - tmp))return 1;
return 0;
}
int main() {
while (scanf("%d%d", &n, &m), n || m) {
if ((n & 1) && (m & 1)) {
puts("0");
continue;
}
if (n < m)n ^= m, m ^= n, n ^= m;
int s = 1 << m;
t = s - 1;
for (int i = 0; i < s; i++)y[i] = check(i);
for (int i = 1; i < n; i++) {
for (int j = 0; j < s; j++)
for (int k = 0; k < s; k++)
if (judge(j, k))x[j] += y[k];
memcpy(y, x, sizeof (x[0]) * s);
memset(x, 0, sizeof (x[0]) * s);
}
printf("%lld\n",y[t]);
}
return 0;
}