【dfs】P5194 [USACO05DEC]Scales S

P5194 [USACO05DEC]Scales S

思路:看题数据范围就表示背包不可能,那么仔细看看发现实际上n的个数最多只有40个,那么dfs就是可取的。但是需要考虑剪枝否则也会T,有以下几点:

1.它是递增排列的求最大值,那么我们可以从后向前dp,同时如果数据大于K时可以不录入减少N的个数。

2.采取前缀和,如果前面所有的sum【i】加和都小于目前的最大值,那么便也没有继续往下搜索的必要了。

#include<cstdio> 
#include<iostream>
#include<algorithm>
#include<cstring>
#include <stack>
#define LL long long

using namespace std;
const int N = 1e6 + 10;
LL  ite[1001],k,maxn,sum[50];
int n;
void dfs(int t,LL ans){
	if(t<1||ans+ite[1]>k) return;
	if(sum[t]+ans<maxn) return;
	if(sum[t]+ans<=k) {
		maxn=max(maxn,sum[t]+ans);
	}
	for(int i=t;i>=1;i--){
		if(ans+ite[i]<=k){
			dfs(i-1,ans+ite[i]);
			maxn=max(maxn,ans+ite[i]);
		}
	}
	return;
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>ite[i];
		if(ite[i]>k){
			n=i-1;
			break;
		}
		
	}
	for(int i=1;i<=n;i++){
		sum[i]=sum[i-1]+ite[i];
	}
	dfs(n,0);
	cout<<maxn;
	return 0; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值