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 }

大为第二关键(因为要求转移时间最小,我们选出的是不转移的瓶子,所以要求最大)

原文地址:https://www.cnblogs.com/ccd2333/p/6392132.html