天天看點

吸氧優化模闆

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<utility>
#include<string>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
int dp[1309][1309];
struct In{
	int w,v;
}p[129]; 
bool cmp(In x,In y)
{
	if(x.v!=y.v)
		return x.v > y.v;
	else return x.w < y.w;
}
int main()
{   
    int t;
    scanf("%d",&t);
    int cnt=1;
    while(t--){
        int n,v1,v2;
        scanf("%d%d%d",&n,&v1,&v2);
        for(int i=1;i<=n;i++){
            scanf("%d",&p[i].w);
         }
        for(int i=1;i<=n;i++){
            scanf("%d",&p[i].v); 
        }
        for(int i=0;i<=v1;i++){
            for(int j=0;j<=v2;j++) dp[i][j]=0; 
        }
        sort(p+1,p+n+1,cmp); 
        int maxn=0;
        for(int i=1;i<=n;i++){
            for(int j=v1;j>=0;j--){
                for(int k=v2;k>=0;k--){
                    if(j>=p[i].w){
                        if(dp[j][k]<dp[j-p[i].w][k]+p[i].v)
                            dp[j][k] = dp[j-p[i].w][k]+p[i].v;
                    }
                    if(k>=p[i].w){
                        if(dp[j][k]<dp[j][k-p[i].w]+p[i].v)
                            dp[j][k] = dp[j][k-p[i].w]+p[i].v; 
                    }
                 }
             }
        }
        for(int i=1;i<=v1;i++){
            for(int j=1;j<=v2;j++){
                if(maxn<dp[i][j]) maxn=dp[i][j];
             }
         }
         printf("Problem %d: %d\n",cnt++,maxn);
     }
}