简单的烦恼题解
简单的烦恼
http://www.nowcoder.com/questionTerminal/271e9b42f2de4732aad87a046d4c6115
每人发,我就来解释一下吧!
由读题可发现,若想听时间尽可能长的歌,在背包容量这一块儿不能设为t,就像样例那样:
t=3+4,那就转化成了01背包(原版)。所以在这里背包容量设为t-1;访问的物品数量因为背包容量,所以被设为了n-1
又因为抛弃了原版,所以在输入完毕后sort摆个序,最后的结果也就是f[t-1]+a[n]<-谁叫a[n]没被访问呢?
=================================代码时间================================
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int mx(int a,int b){return a>b?a:b;}
int T,n,t,a[205],f[80005];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
memset(f,0,sizeof(f));
for(int i=1;i<n;i++)
for(int j=t-1;j>=a[i];j--)
f[j]=mx(f[j],f[j-a[i]]+a[i]);
printf("%d\n",f[t-1]+a[n]);
}
return 0;
}
查看8道真题和解析