油桶问题【递归、动规】

本文探讨了一道关于油桶问题的题目,要求在N个容积不等的油桶中选择k个,使得它们的总容积恰好等于M。提出了三种解决方案:1) 递归方法;2) 普通动态规划;3) 01背包动态规划策略,通过f[i][j]的状态转移来判断是否能达成目标。

题目描述

有N个桶油,容积不相同,问在N桶油里面能否去k桶油加起来恰好容积是M
输入N,M,然后输入N桶油的容积,输出yes or no

1、递归

//递归  
int p(int n,int m)
{ 
//三种情况 
	if(m==0)    
		return 1;
	else if(n==0&&m!=0)
		return 0;	
	else
	{
		
		if(p(n-1,m-a[n])==1) //如果取当前第n桶油满足条件
			return 1;
		if(p(n-1,m)==1) //如果不取当前第n桶油满足条件 
			return 1;	 
		}		
}

2、普通动态规划

bool b[10000];  //b[x]=true代表取x升油是可以实现的 
 
int dong1(int n,int m)
{
	
	if(n==0&&m==0)
	{
		cout<"yes";
		return 0;
	}
	
	b[0]=1; //m=0是可以实现的
	int MAX=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=MAX;j>=0;j--)
		{
			if(b[j])
			{
				//下面就代表 遍历a[i]到a[i]+j 判断是否能装下 
				//j<MAX代表前面所有(0,i-1)油之和 因为当前不可能会超出a[i]+MAX范围 
				b[j+a[i]] =1;  //比如第一桶3L  第二桶5L b[3]=1 b[5]=1 --->b[8]=1 
				if(j+a[i]==m)
				{
					cout<<"yes"<<endl;
					return 0;
				}
			}
		}
		MAX +=a[i];
		
	 }
	 cout<<"no";
	 return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值