简单的烦恼题解
简单的烦恼
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; }