L3-001 凑零钱 (天梯赛)

考虑01背包 因为要求刚好凑满 所以转移的时候要判断一下
最后就是要求输出字典序最小的 首先保证能凑到 再者序列长度尽量长 最后保障小
#include
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e4+5;
int n,m,cnt;
int a[maxn],dp[maxn],vis[maxn][105],ans[maxn];
void print();
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i=a[i];j--)
if(dp[j-a[i]]!=-1)
if(dp[j-a[i]]+1>=dp[j])
dp[j]=dp[j-a[i]]+1,vis[i][j]=1;
if(dp[m]!=-1)
print();
else printf("No Solution");
return 0;
}
void print(){
int j=m;
for(int i=n;i>=1;i--)
if(vis[i][j])
j-=a[i],ans[++cnt]=a[i];
cout<=1;i--)
cout<<" "<