版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}