dp-背包
开始用普通dp写了一发发现没法确定最大时间。。。
后来看到大牛机智的写法,嗯。。。dp表示当前状态能否成立;然后从条件最好的状态开始遍历,直到这个状态成立然后退出遍历。
具体的看代码吧。。。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 int dp[100][10000]; 8 int d[100]; 9 10 int main (){ 11 int T,kase=0; 12 cin>>T; 13 while (T--){ 14 int n,t; 15 cin>>n>>t; 16 for (int i=0;i<n;i++){ 17 cin>>d[i]; 18 } 19 sort (d,d+n); 20 memset (dp,0,sizeof dp); 21 dp[0][0]=1; 22 for (int k=0;k<n;k++){ 23 for (int j=t;j>=d[k];j--){ 24 for (int i=k+1;i>0;i--){ 25 if (dp[i-1][j-d[k]]) 26 dp[i][j]=1; 27 } 28 } 29 } 30 int ans=0; 31 int time; 32 int flag=0; 33 for (int i=n;i>=0;i--){ 34 for (int j=t-1;j>=0;j--){//cout<<j<<" "; 35 if (dp[i][j]){ 36 ans=i; 37 time=j; 38 flag=1; 39 break ; 40 } 41 } 42 if (flag) 43 break ; 44 } 45 cout<<"Case "<<++kase<<": "<<ans+1<<" "<<time+678<<endl; 46 } 47 return 0; 48 }