一.问题描述:牛牛有n袋体积不同的零食,以及一个容量为w的背包,问在不超过背包容量的情况下,牛牛总共有多少种不同的方法?
二.问题分析:在考虑每个零食的时候,这个零食有两种可能,放入背包或是不放入背包,采用递归的思想来解决这个问题。
三.带注释的代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//定义一些全局变量
long ans=0;//用来存储有多少种方法
long w;//背包的最大容量
int n;//有多少种物体
vector<long>value;//用来存储物体的重量
//声明一个函数
void dfs(long sum,int loc);
int main()
{
cin>>n>>w;
long total=0;//用来存储所有物体的重量之和
for(int i=0;i<n;++i)
{
int b;
cin>>b;
value.push_back(b);//对容器进行初始化
total+=value[i];
}
if(total<=w)
{
//所有物体的重量之和小于背包的承重时
//那么所有物体可选可不选
ans=pow(2,n);
}
else
{
//对容器中的元素进行排序 ,
//对容器中的元素进行排序的原因是,如果加上了当前元素后,sum的值已经超过了背包的承重w,那么
//之后的元素就不用再加了。
sort(value.begin(),value.end());
//排序之后开始递归
dfs(0,0);
}
cout<<ans<<endl;
return 0;
}
void dfs(long sum,int loc)
{
if(sum>w)
return;
if(sum<w)
{
ans++;
}
for(int i=loc;i<n;i++)
{
dfs(sum+value[i],i+1);
}
}
四.代码运行结果:3代表有三种不同体积的物体,10代表背包的总容量,1,5,6分别代表物体的体积,6代表方法的种数。