[HDU-2616] DFS

只需要一个小小的处理即可AC

/*
 * hdu-2616
 * mike-w
 * 2012-9-30
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXN 15
#define reset(x) memset(x, 0, sizeof(x))
#define INF 99999

int a[MAXN], m[MAXN];
int N, M;
int tag[MAXN];
int ans;

int search(int cnt, int remain)
{
	if(remain<=0)
		ans=ans<cnt?ans:cnt-1;
	else if(cnt<ans)
	{
		int i;
		for(i=0; i<N; i++)
			if(!tag[i])
			{
				tag[i]=1;
				if(remain<=m[i])
					search(cnt+1, remain-2*a[i]);
				else
					search(cnt+1, remain-a[i]);
				tag[i]=0;
			}
	}
	return 0;
}


int main(void)
{
	int i;
	while(scanf("%d%d", &N, &M)!=EOF)
	{
		reset(a);
		reset(m);
		reset(tag);
		ans=INF;

		for(i=0; i<N; i++)
			scanf("%d%d", a+i, m+i);
		search(1, M);
		printf("%d\n", ans==INF?-1:ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值