【ACM】拦截导弹 - 0-1背包问题

拦截导弹

时间限制: 3000 ms  |  内存限制:65535 KB
难度: 3
 
描述

某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。

 
输入
第一行输入测试数据组数N(1<=N<=10)
接下来一行输入这组测试数据共有多少个导弹m(1<=m<=20)
接下来行输入导弹依次飞来的高度,所有高度值均是大于0的正整数。
输出
输出最多能拦截的导弹数目
样例输入
2
8
389 207 155 300 299 170 158 65
3
88 34 65
样例输出
6
2

思路:0-1背包问题

 
#include <iostream>
using namespace std;

int p[25];
int big = 0;

void Cal(int *a, int n, int k){

    if (k==n)
    {
        int count = 0;
        int cur,z;
        for (z = 0 ; z < n; z++)
        {
            if (a[z]==1)
            {
                cur = p[z];
                count++;
                break;
            }
        }
        for (int i = z+1 ; i < n ; i++)
        {
            if (a[i]==1 && p[i]<cur)
            {
                count++;
                cur = p[i];
            }
        }
        if (count >= big)
        {
            big = count;
        }
        return;
    }
    a[k] = 1;
    Cal(a,n,k+1);
    a[k] = 0;
    Cal(a,n,k+1);

}

int main(){

    int n;
    cin>>n;
    while (n--)
    {
        int m;
        big = 0;
        cin>>m;
        int *b = new int[m];
        for (int i = 0 ; i < m ; i++)
        {
            cin>>p[i];
        }
        Cal(b,m,0);
        cout<<big<<endl;
    }

    return 0;
}        

猜你喜欢

转载自www.cnblogs.com/lyc94620/p/9289314.html
今日推荐