码迷,mamicode.com
首页 > 其他好文 > 详细

cf 730J. Bottles

时间:2017-02-12 23:46:44      阅读:336      评论:0      收藏:0      [点我收藏+]

标签:tchar   ott   logs   --   c++   getc   size   背包   for   

搞一个背包,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

标签:tchar   ott   logs   --   c++   getc   size   背包   for   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!