关闭

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

标签: 背包动态规划
643人阅读 评论(0) 收藏 举报
分类:

题目来自:http://blog.csdn.net/sdc1992/article/details/8034440

杀伤力
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


开始想建个50005*50005的数组,发现即使开全局变量也不行,后来尝试用new,发现运行报错,看了下别人的思路,把m,g同时处以25,问题解决(结果可能会有1-24的误差,但这对最后结果无影响,因为没有意见物品可以用24买的)。


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


我的代码

#include <iostream>
#define maxv 2013
using namespace std;
int ans[maxv][maxv],m,g,z,s,e,lir[3];
int c[3][2]={{4,0},{5,2},{2,4}};
int main()
{
    while(cin>>m>>g>>lir[0]>>lir[1]>>lir[2]){
        if(m==0 && g==0 && lir[0]==0 && lir[1]==0 && lir[2]==0)
            break;
        m /= 25; g /= 25;
        for(int i=0; i<3; i++){
            for(int j=c[i][0]; j<=m; j++){
                for(int k=c[i][1]; k<=g; k++){
                    ans[j][k]=max(ans[j][k], ans[j-c[i][0]][k-c[i][1]]+lir[i]);
                }
            }
        }
        cout<<ans[m][g]<<endl;
    }
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:45962次
    • 积分:1067
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:17篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论