zoj 1013

 #include <stdio.h>
 #include <string.h>
 #include <iostream>
 using namespace std;
 int n;
 int w1, s1, d1;
 int w2, s2, d2;
 int w3, s3, d3;
 int c1, c2, c3, d4;
 int opt[2][501][501];
 struct
 {
        int w, s;
 }caravan[101];
 int put(int k, int i, int j)//第三种设备还能在第k个车放多少
 {
     int w = (caravan[k].w - i * w1 - j * w2) / w3;
     int s = (caravan[k].s - i * s1 - j * s2) / s3;
     if(w <= 0 || s <= 0) return 0;
     return (w < s ? w : s);
 }
int main()
{
     int cs = 0;
     while(cin >> n)
     {
         if(n == 0) break;
         cin >> w1 >> s1 >> d1;
         cin >> w2 >> s2 >> d2;
         cin >> w3 >> s3 >> d3;
         cin >> c1 >> c2 >> c3 >> d4;
         for(int i = 1; i <= n; i++)
             cin >> caravan[i].w >> caravan[i].s;
         memset(opt, 0, sizeof(opt));
         int mx = 0, my = 0;
         for(int k = 1; k <= n; k++)//通过动规把每一种最优组合记载下来
         {
             memset(opt[1], 0XFF, sizeof(opt[1]));
             int mmx = mx, mmy = my;
             for(int i = 0; i <= mx; i++)//第一种设备已有
             for(int j = 0; j <= my; j++)//第2种设备已有
             {
                 if(opt[0][i][j] == -1) continue;
                 for(int p = 0; p * w1 <= caravan[k].w && p * s1 <= caravan[k].s; p++)
                 /* 第一种设备添加数目*/
                 for(int q = 0; p * w1 + q * w2 <= caravan[k].w && p * s1 + q * s2 <= caravan[k].s; q++)
                 {/*第2种设备添加数目*/
                     opt[1][i + p][j + q] >?= (opt[0][i][j] + put(k, p, q));
                     //看在一二种设备一样的情况下第三种设备所能放的最大数目
                     mmx >?= i + p;
                     mmy >?= j + q;
                 }
             }
             mx = mmx;//第一种设备在第x(1,2,3)辆车中所能放的最大数目
             my = mmy;//第二种设备在第x(1,2,3)辆车中所能放的最大数目
             memcpy(opt[0], opt[1], sizeof(opt[1]));
         }
         int max = 0;
         //通过搜索在所有的车上设备数目的搭配 求最大值
         for(int i = 0; i <= mx; i++)//第一种设备
         for(int j = 0; j <= my; j++)//第2种设备
         if(opt[0][i][j] >= 0)//第三种设备
         {
             if(d4 > c1 * d1 + c2 * d2 + c3 * d3)//可以合成武器
             {
                 int t1 = i, t2 = j, t3 = opt[0][i][j], cur = 0;
                 while(t1 - c1 >= 0 && t2 - c2 >= 0 && t3 - c3 >= 0)
                 {
                     t1 -= c1;
                     t2 -= c2;
                     t3 -= c3;
                     cur += d4;
                 }
                 cur += (t1 * d1 + t2 * d2 + t3 * d3);
                 max >?= cur;
             }
            else max >?= (i * d1 + j * d2 + opt[0][i][j] * d3);
        }
        if(cs)cs++;
         cout << "Case " << cs << ':' << ' ' << max << endl;
     }
     return 0;
 }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值