thinking:每颗石头都有大小,分为取与不取则为2^n次方种方法,枚举出所有可能放入背包的可能性.
第一行为S 、N。
S为背包大小,N为石头个数,下行为每个石头的重量,判断是否有石头相加能等于背包大小.
例子为:
10 5
1 2 3 4 5
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin >> n >> m;
int w[m];
int f1=1;
int i,j,k,l,sum;
int f2[m];
for(i=0;i<m;i++){
cin >> w[i];
f1*=2;
}
//cout << f1 << endl;
for(i=0;i<f1;i++){
for(l=0;l<m;l++)
if(f2[l]==0){
f2[l]=1;
continue;
}else{
f2[l]=0;
break; //此时放break是因为有石头取出来,便计算这次
}
sum=0;
for(j=0;j<m;j++)
if(f2[j]==1)sum+=w[j];
if(sum==n){
cout << "Yes" << endl;
for(k=0;k<m;k++)
if(f2[k]==1)
cout << w[k] << endl;
}
}
return 0;
}