P5194 [USACO05DEC]Scales S

在这里插入图片描述

思路

其实还是一知半解
用前缀和优化的DFS
先做个前缀和
然后每次找一个数,如果这个数前面所有的数加上这个数都可以取,就直接取
不行的话就在这个数的前面找数,然后判断能否全部取走,能取走就取走,然后得到最大值,然后最终是用不可以取走所有前面的情况下在从前面重新开始枚举。
在这里插入图片描述
还不太懂,但要是可以把这题搞懂,对搜索水平会有很大的提升!

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, c;
const int N = 10005;
int a[N], sum[N];
int ans = 0;

void dfs(int cnt, int x)
{
	if (x > c)
	{
		return;
	}
	if (sum[cnt - 1] + x <= c)
	{
		ans = max(ans, sum[cnt - 1] + x);
		return;
	}
	ans = max(ans, x);
	for (int i = 1; i < cnt; i ++ )
	{
		dfs(i, x + a[i]);
	}
}


signed 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值