cf 730J. Bottles
Posted ws_ccd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf 730J. Bottles相关的知识,希望对你有一定的参考价值。
搞一个背包,233
要求用的瓶数最少,那么就业瓶数为第一关键,当瓶数相当后再以a[i]
1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls tr[x][0] 6 #define rs tr[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();} 12 while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();} 13 return x*f; 14 } 15 int a[N],b[N]; 16 int f[N],size[N]; 17 int main() 18 { 19 int n=ra(),sum=0,tot=0; 20 memset(size,0x7,sizeof(size)); size[0]=0; 21 for (int i=1; i<=n; i++) a[i]=ra(),sum+=a[i]; 22 for (int i=1; i<=n; i++) b[i]=ra(),tot+=b[i]; 23 for (int i=1; i<=n; i++) 24 for (int j=tot; j>=0; j--) 25 { 26 if (size[j]+1==size[j+b[i]]) 27 f[j+b[i]]=max(f[j+b[i]],f[j]+a[i]); 28 if (size[j]+1<size[j+b[i]]) 29 { 30 size[j+b[i]]=size[j]+1; 31 f[j+b[i]]=f[j]+a[i]; 32 } 33 } 34 int anssz=inf,ans; 35 for (int i=sum; i<=tot; i++) 36 { 37 if (anssz==size[i]) 38 ans=max(ans,f[i]); 39 if (anssz>size[i]) 40 { 41 anssz=size[i]; 42 ans=f[i]; 43 } 44 } 45 printf("%d %d",anssz,sum-ans); 46 return 0; 47 }
大为第二关键(因为要求转移时间最小,我们选出的是不转移的瓶子,所以要求最大)
以上是关于cf 730J. Bottles的主要内容,如果未能解决你的问题,请参考以下文章