5 10 //5代表5件物品 10代表 取这5件物品种 哪几样 可以加起来为10
1 2 3 4 5
//第1件物品重量1
//第2件物品重量2
//第3件物品重量3
//第4件物品重量4
//第5件物品重量5
现在我们想,我们有一个布袋,初始状态里面是空的,意味着哪几方面信息?
第一, 重量为0
第二, 物品个数为0
第三, 总重量不等于10
以上状态我们用0来表示
接下来我们分析我们对第一个物品可以做的事,就是把他放进布袋,或不放进布袋
那们结合前面的0状态,再加上第一个物品的两个状态就可以看到以下情况:
0
0 1 0代表不取 1代表取
如果这看明白了,在对一个物品处理之后,就是处理第二个物品
是不是:
0
0 1
0 1 0 1
同样第三个,第四个也是这原理
0
0 1
0 1 0 1
0 1 0 1 0 1 0 1
...
如果以上能理解了,就应当有递归的感觉了
题目要求:找到一组解即可。说明会有很多情况其实是可以满足要求的:
比如上面的案例: 1234为10 145为10 235为10
接下来用代码写函数
cpp
5 10 //5代表5件物品 10代表 取这5件物品种 哪几样 可以加起来为10
1 2 3 4 5
//第1件物品重量1
//第2件物品重量2
//第3件物品重量3
//第4件物品重量4
//第5件物品重量5
现在我们想,我们有一个布袋,初始状态里面是空的,意味着哪几方面信息?
第一, 重量为0
第二, 物品个数为0
第三, 总重量不等于10
以上状态我们用0来表示
接下来我们分析我们对第一个物品可以做的事,就是把他放进布袋,或不放进布袋
那们结合前面的0状态,再加上第一个物品的两个状态就可以看到以下情况:
0
0 1 0代表不取 1代表取
如果这看明白了,在对一个物品处理之后,就是处理第二个物品
是不是:
0
0 1
0 1 0 1
同样第三个,第四个也是这原理
0
0 1
0 1 0 1
0 1 0 1 0 1 0 1
.....
如果以上能理解了,就应当有递归的感觉了
题目要求:找到一组解即可。说明会有很多情况其实是可以满足要求的:
比如上面的案例: 1234为10 145为10 235为10
接下来用代码写函数
#include<iostream>
using namespace std;
typedef struct {
int index;
int value;
}Data;
int a[10000],s,n;
Data data[10000];
int size;
bool check(int Sumweigth,int cnt){
if(cnt==-1) return Sumweigth==s;//如没有可选,返回布袋与要求的是否一致
else if(check(Sumweigth+a[cnt],cnt-1)){//当前位置放入布袋继续分析
data[size].index=cnt;
data[size].value=a[cnt];
size++;
return true;
}else if(check(Sumweigth,cnt-1)){//当前位置没进包里,继续分析
return true;
}
return false ;
}
void print(){
for(int i=0;i<size;i++)
cout<<"number:"<<data[i].index+1<<" weight:"<<data[i].value<<endl;//index+1 因为下标是从0开始的
}
void solve(){
cin>>n>>s;
for(int i=0;i<n;i++)
cin>>a[i];
if(check(0,n-1))
print();
else
cout<<"not found"<<endl;
}
int main(){
solve();
return 0;
}