Jin Ge Jin Qu hao UVA - 12563
这个地方学到的就是用结构体来存储没有个地方的最优状态(当最优的状态要求有2个或以上的时候)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
const int maxn=10000;
struct Node{
int cnt;
int c;
}dp[maxn];
int a[maxn];
int main(){
int t;
scanf("%d",&t);
int cas=0;
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
m--;
sort(a+1,a+1+n);
//cout<<m<<endl;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i){
for(int j=m;j>=a[i];j--){
if(dp[j].cnt<dp[j-a[i]].cnt+1){
dp[j].cnt=dp[j-a[i]].cnt+1;
dp[j].c=dp[j-a[i]].c+a[i];
}
if(dp[j].cnt==dp[j-a[i]].cnt+1){
if(dp[j].c<dp[j-a[i]].c+a[i]){
dp[j].c=dp[j-a[i]].c+a[i];
}
}
}
}
printf("Case %d: %d %d\n",++cas,dp[m].cnt+1,dp[m].c+678);
}
}