题目:
思路分析:
思路1:dfs暴力搜索+路径记录
思路2:01背包+路路径记录
代码实现:
思路1:
const int MAX=1e4+5;
int n,m;
int flag;
int a[MAX];
int pos;
int b[MAX];
void dfs(int u,int s){
if(s>m||flag)return;
if(s==m){
flag=1;
for(int i=1;i<=pos;i++){
if(i==pos) cout<<b[i];
else cout<<b[i]<<" ";
}
return;
}
for(int i=1+u;i<=n;i++){
b[++pos]=a[i];
dfs(i,s+a[i]);
pos--;
}
return;
}
int main(){
cin>>n>>m;
ll s=0;
for(int i=1;i<=n;i++){
cin>>a[i];
s+=a[i];
}
if(s<m) cout<<"No Solution";
else {
sort(a+1,a+1+n);
dfs(0,0);
if(!flag)cout<<"No Solution";
}
}
思路二:
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
* __----~~~~~~~~~~~------___
* . . ~~//====...... __--~ ~~
* -. \_|// |||\\ ~~~~~~::::... /~
* ___-==_ _-~o~ \/ ||| \\ _/~~-
* __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
* _-~~ .=~ | \\-_ '-~7 /- / || \ /
* .~ .~ | \\ -_ / /- / || \ /
* / ____ / | \\ ~-_/ /|- _/ .|| \ /
* |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
* ' ~-| /| |-~\~~ __--~~
* |-~~-_/ | | ~\_ _-~ /\
* / \ \__ \/~ \__
* _--~ _/ | .-~~____--~-/ ~~==.
* ((->/~ '.|||' -_| ~~-/ , . _||
* -_ ~\ ~~---l__i__i__i--~~_/
* _-~-__ ~) \--______________--~~
* //.-~~~-~_--~- |-------~~~~~~~~
* //.-~~~--\
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 神兽保佑 永无BUG
*/
const int MAX=10010;
const int MAXN=110;
int dp[MAX];
int v[MAX];
int n,m;
int pre[MAXN][MAXN];
bool cmp(int a,int b){
return a>b;
}
int main(){
cin>>n>>m;
ll s=0;
for(int i=1;i<=n;i++){
cin>>v[i];
s+=v[i];
}
if(s<m){
cout<<"No Solution";
return 0;
}
sort(v+1,v+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
if(dp[j]<=dp[j-v[i]]+v[i]){
dp[j]=dp[j-v[i]]+v[i];
pre[i][j]=1;
}
}
}
if(dp[m]!=m) {
cout<<"No Solution";
return 0;
}
for(int i=n,j=m;i>=1&&j>=0;i--){
if(pre[i][j]){
if(j==m) cout<<v[i];
else{
cout<<" "<<v[i];
}
j-=v[i];
}
}
}