【刷题】【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; }