【刷题】【cf】D. Make Them Equal

 

所有操作都是从1开始,所以可以n^2的复杂度预处理

问题就简化成,n个包裹,k的容积,每个包裹v体积c价值,

即01背包,n*m复杂度,太高,得缩小m

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long 
using namespace std;
inline int read()
{
    int x=0;char c=getchar();
    while(c<'0' || c>'9' ) c=getchar();
    while(c>='0'&&c<='9' ) x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x;
}
int T;

int n,k;
const int N=1010,M=12010;
int d[N],c[N],f[N];
int dp[M];

int main()
{
    for(int i=1;i<1000;i++)
    {
        for(int j=1;j<=i;j++)
        {
            int k=i+i/j;
            if(!f[k] ) f[k]=f[i]+1;
            else f[k]=min(f[k],f[i]+1);
        }
    }
    
    cin>>T;
    while(T--)
    {
        n=read(),k=read();
        for(int i=1;i<=n;i++) d[i]=read(); 
        for(int i=1;i<=n;i++) c[i]=read(); 
        //背包问题但是1e9太大
        //注意到d[i]数组的最大值为12
        //实际,背包体积最大为12*1e3
        memset(dp,0,sizeof(dp));
        k=min(12000,k); 
        for(int i=1;i<=n;i++)
            for(int j=k;j>=f[d[i]];j--)
                dp[j]=max(dp[j],dp[j-f[d[i]]]+c[i]);
        printf("%d\n",dp[k]);
    }
    
    return 0;
} 
View Code

 

posted @ 2022-02-02 01:31  心若笺诗  阅读(72)  评论(0编辑  收藏  举报