P5194 [USACO05DEC]Scales S

https://www.luogu.com.cn/problem/solution/P5194
涉及知识点:搜索,前缀和
黄色题
 
思路:
  • 首先,既然是求最大,那么就应该从后往前搜索,能够避免很多不必要的递归;然后,弄一个一个前缀和数组,显然,当cur+b[index]即当前加上位置i的前缀和如果小于max时,就不用继续往下了,因为就算你把它们全部都选上也不会比max大,故是无用功,剪掉;至于cur+fama[index]>C则更不用说了,这应该是很容易想得到的。


代码:
#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;
}

 

posted @ 2022-07-21 16:05  -イレイナ  阅读(40)  评论(0)    收藏  举报