##动态规划,01背包
title:UVa12563
#include <bits/stdc++.h>
using namespace std;
const int N = 55, M = 180;
int dp[N * M];
int main()
{
int kase=0,t,n,time,d;
cin >> t;
while(t--)
{
cin >> n >> time;
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=0;i<n;i++){
cin >> d;
for(int j=time-d;j>=0;j--){
if(dp[j]!=-1) dp[j+d]=max(dp[j]+1,dp[j+d]);
}
}
int ans=time-1;
for(int i=ans;i>=0;i--)
{
if(dp[i]>dp[ans]) ans=i;
}
cout << "Case " << ++kase << ": " << dp[ans]+1 << " " << ans+678 << endl;
}
return 0;
}
书上的题,代码也提示了一大部分;值得注意的是,①:对于数组空间的选取是根据题目分析的,t<=180*n+678;②:对于dp数组的初始化用的是-1而不是0,主要原因是对于第一首的选取问题,赋值0的话会出现决策失误的情况。