第四十四天 复习加小记一个题

约翰秤牛问题

每次称牛时,他都把某头奶牛安置在天平的某一边,然后往天平另一边加砝码,直到天平平衡,于是此时砝码的总质量就是牛的质量(约翰不能把砝码放到奶牛的那边,因为奶牛不喜欢称体重,每当约翰把砝码放到她的蹄子底下,她就会尝试把砝码踢到约翰脸上)。

 

天平能承受的物体的质量不是无限的,当天平某一边物体的质量大于 CC ( 1 \leq C \leq 2^{30}1≤C≤2 

30

  )时,天平就会被损坏。砝码按照它们质量的大小被排成一行。并且,这一行中从第3个砝码开始,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和。

 

约翰想知道,用他所拥有的这些砝码以及这架天平,能称出的质量最大是多少。由于天平的最大承重能力为 CC ,他不能把所有砝码都放到天平上。

 

现在约翰告诉你每个砝码的质量,以及天平能承受的最大质量,你的任务是选出一些砝码,使它们的质量和在不压坏天平的前提下是所有组合中最大的。

这是大佬做法

 

#include <iostream>
#include <algorithm>
using namespace std;
long long sum[1005],a[1005],ans,n,c;void dfs(int cur,long long x)
{
 if(x>c)return;
 if(sum[cur-1]+x<=c)
 //一个剪枝:如果前面那些砝码可以全部取走,那直接取走即可。
 {
  ans=max(ans,sum[cur-1]+x);
  return;
 }
 ans=max(ans,x);
 for(int i=1;i<cur;i++)
  dfs(i,x+a[i]);
 return;
}
int main()
{
 cin>>n>>c;
 for(int i=1;i<=n;i++)
 {
  cin>>a[i];
  sum[i]=sum[i-1]+a[i];
 }
 dfs(n+1,0);
 cout<<ans<<endl;
 return 0;
}

这是我的二十分做法

#include<iostream>

#include<algorithm>

using namespace std;

const int N=1e6+10;

int n,c,a[N];

int sum=0;

 

int DFS(int t)

{

    if(t==0) return 0;

    for(int i=t;i>=1;i--)

        if(a[i]>=c) continue;

        else

        {

            sum+=a[i];

            c-=sum;

            DFS(t-1);

          

        }

        return sum;

}

 

int main()

{

    scanf("%d %d",&n,&c);

    for(int i=1;i<=n;i++)

       {

         scanf("%d",&a[i]);

       }

    cout << DFS(n)<< endl;

    return 0;

}

 

裂了,一个小时做了二十分😂明天修改一下。

怎么说,明天继续冲。晚安💤

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值