题目大意:给定n首歌和总时间t,以及n首歌的时间。在不超过(t-1)的时间里选择尽可能多的歌的数量,若数量相同,则歌的总时间最大。
01背包:
物品体积:歌的时间;物品价值:1;背包容量:t-1;
dp的时候动态更新最大数量。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n, t;
int dp[N];
int w[55];
int main()
{
int cc;
scanf("%d", &cc);
for(int cas = 1; cas <=cc; ++cas)
{
scanf("%d %d", &n, &t);
memset(dp, -1, sizeof(dp));
int sumnum = 0;
dp[0] = 0;
for(int i = 1; i <= n; ++i)
{
scanf("%d", &w[i]);
for(int j = t-1; j >= 0; --j)
{
if(j>=w[i] && dp[j-w[i]]>=0)//point
dp[j] = max(dp[j], dp[j-w[i]]+1);
sumnum = max(sumnum, dp[j]);
}
}
for(int i = t-1; i >= 0; --i)
if(dp[i]==sumnum)
{
printf("Case %d: %d %d\n", cas, sumnum+1, i+678);
break;
}
}
return 0;