一个简单的0-1背包,背包容量为t-1,每个物品价值为1,代价为t[i]。背包容量为t-1而不是t的原因是留1s唱《劲歌金曲》。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=180*50+678+5;
struct node{
int len,tim;
node(){
}
node(int l,int t):len(l),tim(t){
}
}dp[55][maxn];
int a[55];
int n,t;
int main(){
int T,kase=0;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&t);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
memset(dp[0],0,sizeof(dp[0]));
for(int i=1;i<=n;++i)
for(int j=0;j<t;++j){
if(i==1) dp[i][j]=node(0,0);
else dp[i][j]=dp[i-1][j];
if(j>=a[i]){
if(dp[i-1][j-a[i]].len+1>dp[i][j].len) {
dp[i][j].len=dp[i-1][j-a[i]].len+1;
dp[i][j].tim=dp[i-1][j-a[i]].tim+a[i];
}
else if(dp[i-1][j-a[i]].len+1==dp[i][j].len){
dp[i][j].tim=max(dp[i-1][j-a[i]].tim+a[i],dp[i][j].tim);
}
}
}
printf("Case %d: ",++kase);
printf("%d %d\n",dp[n][t-1].len+1,dp[n][t-1].tim+678);
}
return 0;
}
可以用滚动数组优化内存。
可能我的代码思路不是很简洁明了,附上汝佳大哥的代码汝佳大哥代码
如有不当之处欢迎指出。