思路:动态规划…这个题做得我好痛苦
看了题解才发现原来只需要逆序做DP,就可以保证选出来的解是顺序的了…
#include <bits/stdc++.h>
using namespace std;
int coin[10010];
int dp[10010][110];
int ans[10010];
bool cmp(int a,int b)
{
return a>b;
}
int main(void)
{
int M,N;
scanf("%d%d",&M,&N);
for(int i=0;i<M;i++)
scanf("%d",&coin[i]);
sort(coin,coin+M,cmp);
for(int v=0;v<N;v++)
dp[0][v]=0;
for(int i=1;i<=M;i++) //visit all the coins
{
for(int v=coin[i-1]-1;v<N;v++)
{
dp[i][v]=max(dp[i-1][v],dp[i-1][v-coin[i-1]]+coin[i-1]);
}
}
if(dp[M][N-1]==N)
{
int i,p=0,v=N-1;
for(i=M;i>0;i--)
if(dp[i][N-1]==N) break;
while(v!=-1)
{
if(dp[i][v]==dp[i-1][v-coin[i-1]]+coin[i-1])
{
ans[p]=coin[i-1];p++;
v-=coin[i-1];i--;
}
else i--;
}
for(i=0;i<p;i++)
{
printf("%d",ans[i]);
if(i!=p-1) printf(" ");
}
}
else printf("No Solution");
}