UVA - 12563 Jin Ge Jin Qu hao (01背包变形)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a54665sdgf/article/details/80557881

题目大意:给你n个正数,让你在sum<t的限定条件下,尽可能地选择最多的数,而且要使得这些数的和最大。

思路:我们可以用一个cnt数组来记录组合成一个数所需要的最多的数,即组合成i最多需要cnt[i]个数。初始状态为cnt[0]=0,表示组合成0最多需要0个数。cnt[i]=-1表示i无法组合出。

一开始需要把cnt初始化为-1,并把cnt[0]设为0,然后把给你的n个数逐个往里放,每放进一个数就更新一次cnt值。由于我们只关心组合成i所需要的“最多”的数,所以只需要考虑max值就可以了。

AC代码:

#include<bits/stdc++.h>
#define FRER() freopen("i.txt","r",stdin)

using namespace std;
const int N=50*180+100;
int n,t,kase,cnt[N];

int main()
{
    //FRER();
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(cnt,-1,sizeof cnt);
        cnt[0]=0;
        scanf("%d%d",&n,&t);
        while(n--)
        {
            int x;
            scanf("%d",&x);
            for(int i=t-1-x; i>=0; --i)
                if(~cnt[i])
                    cnt[i+x]=max(cnt[i+x],cnt[i]+1);
        }
        int maxcnt=-1,maxnum;
        for(int i=t-1; i>=0; --i)
        {
            if(cnt[i]>maxcnt)
                maxcnt=cnt[i],maxnum=i;
        }
        printf("Case %d: %d %d\n",++kase,maxcnt+1,maxnum+678);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a54665sdgf/article/details/80557881