为了账号安全,请及时绑定邮箱和手机立即绑定

简单背包问题的递归C++算法?

简单背包问题的递归C++算法?

C++
LEATH 2018-10-16 06:02:46
设有一个背包可以放入的物品的重量为s,现有n件物品,重量分别为w[1], w[2], …, w[n]。问能否从这n件物品中选择若干件放入此背包中,使得放入的重量之和正好为s。如果存在一种符合上述要求的选择,则称此背包问题有解(或称其解为真);否则称此背包问题无解(或称其解为假)。试用递归方法设计求解背包问题的算法。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

#include<stdio.h>
#define MAXN 1000
int s[MAXN],n;
bool dp[MAXN];
void dfs(int m,int from)
{
int i;
if(dp[m])
return ;
for(i=from;i<n;i++)//如果物品可以多次去from都重0开始
{
if(m>=s[i])
{
dfs(m-s[i],from+1);
if(dp[m-s[i])
{
dp[m]=true;
break;
}
}
}
}
int main()
{
int i;
memset(dp,false,sizeof(dp));
dp[0]=true;
scanf("%d%d",&n,&m);//个数和要求质量
for(i=0;i<n;i++)
scanf("%d",&s[i]);
dfs(m,0);
if(dp[m])
printf("存在选择");
else
printf("不存在");
return 0;
}
没有编译器不知道效果怎么样,思路是没错的了



查看完整回答
反对 回复 2018-11-18
  • 1 回答
  • 0 关注
  • 1033 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信