hnust队内选拔赛第二场 杀伤力(二维完全背包)

杀伤力
Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Problem Description
有一个游戏,提供你两种资源MIN和GAS. 然后可以购买ZE,ST,SE三种设备武装你的军队.每单位ZE需要花费100 MIN ,但不需要GAS.每单位ST需要花费125 MIN和 50 GAS.每单位SE需要花费50 MIN和 100 GAS.
给定资源量和每种设备的杀伤值,求如何装备军队使得杀伤力最大
Input
输入含多个测试用例,每行一个测试用例。每个测试用例有5个整数. M (0<=M<=50000),你拥有的MIN数量.G (0<=G<=50000), 你拥有的GAS数量. Z (0 <= Z<=1000), 每个ZE的杀伤值. S (0<= S<=1000), 每个ST的杀伤值. E
(0<=E<=1000) ,每个SE的杀伤值. 输入M = G =Z =S = E = 0表示结束,不应该处理.
Output
对每个测试用例,单独一行输出最大的杀伤力
Sample Input
500 400 10 20 15
0 0 0 0 0
Sample Output
95
Author

hnust_loser


http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=17157&pid=1001

思路:先将数据规模缩小,然后用二维的完全背包就可以直接解决了。

#include<iostream>
#include<cstring>

using namespace std;

int bag[2222][2222];
int m[]={4,5,2},g[]={0,2,4};
int val[3];

int main()
{
    int mmax,gmax,z,s,e;
    while(cin>>mmax>>gmax>>val[0]>>val[1]>>val[2])
    {
        if(!(mmax||gmax||val[0]||val[1]||val[2]))
            break;
        mmax/=25;gmax/=25;
        memset(bag,0,sizeof(bag));
        for(int i=0;i<3;i++)
        {
            for(int j=m[i];j<=mmax;j++)
            {
                for(int k=g[i];k<=gmax;k++)
                {
                    if(bag[j][k]<bag[j-m[i]][k-g[i]]+val[i])
                        bag[j][k]=bag[j-m[i]][k-g[i]]+val[i];
                }
            }
        }
        cout<<bag[mmax][gmax]<<endl;
    }
    return 0;
}


你可能感兴趣的:(游戏,测试,input,output)