首页 > 代码库 > cf 730J. Bottles
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。