hdu 2639
0/1背包问题,只是对于每一个volume保留前k个值,
View Code
Problem : 2639 ( Bone Collector II )     Judge Status : Accepted
RunId : 5569215 Language : C++ Author : billforum
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
RunId : 5569215 Language : C++ Author : billforum
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int value[1005],volume[1005]; int f[1005][50],A[50],B[50]; int n,v,k; void dp() { int i,j,q,a,b,c; memset(f,0,sizeof(f)); for(i=1;i<=n;i++) for(j=v;j>=volume[i];j--) { for(q=1;q<=k;q++) { A[q]=f[j-volume[i]][q]+value[i]; //选取新队列A B[q]=f[j][q]; //选取新队列B } A[q]=-1;B[q]=-1; //把A、B的第k+1个元素标记为-1 a=b=c=1; while(c<=k&&(A[a]!=-1||B[b]!=-1)) //合并A、B两个有序队列,并赋给有序队列f[j][1...k] { if(A[a]>B[b]) f[j][c]=A[a],a++; else f[j][c]=B[b],b++; if(f[j][c]!=f[j][c-1]) c++; } } cout<<f[v][k]<<endl; } int main() { //freopen("in.txt","r",stdin); int t,i; cin>>t; while(t--) { cin>>n>>v>>k; for(i=1;i<=n;i++) cin>>value[i]; for(i=1;i<=n;i++) cin>>volume[i]; dp(); } return 0; }
                    
                
                
            
        
浙公网安备 33010602011771号