zoj 1013
2008-04-15 12:22
399 查看
#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;
}
#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;
}
相关文章推荐
- ZOJ 1013 Great Equipment ---- DP
- zoj 1013 Great Equipment DP
- ZOJ 1013 Great Equipment(DP)
- ZOJ 1013
- ZOJ 1013 Great Equipment
- ZOJ 1013 Great Equipment
- HDU 1482/ZOJ 1184/FOJ 1003/POJ 1013 Counterfeit Dollar
- ZOJ Problem Set - 1013
- ZOJ 1013 Great Equipment(DP)
- Zoj1013 2011.2.26
- ZOJ 1013 Great Equipment
- Great Equipment - ZOJ 1013 dp
- zoj 1013
- [DP] ZOJ1013、1027、1074
- zoj 1013 Great Equipment
- zoj 1013 Great Equipment
- ZOJ 1013 Great Equipment (DP)
- zoj——3623(dp)
- (DP) zoj 3305
- ZOJ2539