hdu 2639 Bone Collector II
01背包统计第k优解,多开一维的数组,用来记录第几优解,然后每次更新的时候合并一下。。。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #define N 1100 5 #define K 100 6 using namespace std; 7 int dp[N][K],w[N],v[N],s[N]; 8 bool cmp(int a,int b){ 9 return a>b; 10 } 11 int main(){ 12 int n,m,k,T; 13 cin>>T; 14 while(T--){ 15 cin>>n>>m>>k; 16 for(int i=1;i<=n;i++)cin>>v[i]; 17 for(int i=1;i<=n;i++)cin>>w[i]; 18 memset(dp,0,sizeof(dp)); 19 for(int i=1;i<=n;i++){ 20 int cnt; 21 for(int j=m;j>=w[i];j--){ 22 cnt=0; 23 for(int t=1;t<=k;t++){ 24 s[++cnt]=dp[j-w[i]][t]+v[i]; 25 s[++cnt]=dp[j][t]; 26 } 27 sort(s+1,s+1+cnt,cmp); 28 int x=1; 29 dp[j][x++]=s[1]; 30 for(int t=2;t<=cnt;t++){ 31 if(s[t]!=s[t-1]){ 32 dp[j][x++]=s[t]; 33 } 34 if(x>k)break; 35 } 36 } 37 } 38 cout<<dp[m][k]<<endl; 39 } 40 return 0; 41 }