题意:给出所有钞票,凑出给定金额,输出用了哪些钱,并且要求钱的序列最小。
题解:01背包,要求最小实际上就是要求尽量长。
代码:
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
const int inf = 0x3f3f3f3f;
int dp[maxn];
int a[maxn],pre[maxn],ans[maxn];
int main()
{
int n,i,j,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<=m;i++)dp[i]=-inf;
sort(a+1,a+n+1);
dp[0]=0;
for(i=1;i<=n;i++){
for(j=m;j>=a[i];j--){
if(dp[j]<=dp[j-a[i]]+1){
dp[j]=dp[j-a[i]]+1;
pre[j]=j-a[i];
}
}
}
int cnt=0;
if(dp[m]>0){
i=m;
while(pre[i]!=0){
ans[++cnt]=i-pre[i];
i=pre[i];
}
ans[++cnt]=i;
while(cnt>=1){
printf("%d",ans[cnt]);
cnt--;
if(cnt)printf(" ");
else printf("\n");
}
}
else printf("No Solution\n");
// cout << "Hello world!" << endl;
return 0;
}