题目描述
有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;
}

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

被折叠的 条评论
为什么被折叠?



