加一个flg数组,j是记录的背包容量,i是记录其对应a[]数组下标
这里肯定要先从大到小排一下的,这样最后加的就是1,否则就是9,保证了输出最小序列。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10004;
int dp[maxn],a[maxn];
bool flg[maxn][maxn];
int cmp(int a, int b){return a > b;}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=m;j>=a[i];j--){
if(dp[j-a[i]]+a[i]>=dp[j]){ //等于是必不可少的,每种情况都要进来
flg[i][j]=true;
dp[j]=dp[j-a[i]]+a[i];
}
}
}
if(dp[m]==m){
vector<int> arr;
int v = m, index = n;
while(v > 0) {
if(flg[index][v] == true) {
arr.push_back(a[index]);
v -= a[index];
}
index--;
}
for(int i = 0; i < arr.size(); i++) {
if(i != 0) printf(" ");
printf("%d", arr[i]);
}
cout<<endl;
}
else
cout<<"No Solution"<<endl;
return 0;
}