2022.2.10 练习 PAT 甲 1068 Find More Coins (原题链接)
背包问题
#include <bits/stdc++.h>
using namespace std;
int c[10010];
int dp[10010]={0};
int choice[10010][110];
int flag[10010];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>c[i];
}
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int v=m;v>=c[i];v--)
{
if(dp[v]<=dp[v-c[i]]+c[i])
{
dp[v]=dp[v-c[i]]+c[i];
choice[i][v]=1;
}
else
choice[i][v]=0;
}
}
if(dp[m]!=m)
{
cout<<"No Solution";
}
else
{
int k=n,num=0,v=m;
while(k>=0)
{
if(choice[k][v]==1)
{
flag[k]=1;
v-=c[k];
num++;
}
else
flag[k]=0;
k--;
}
for(int i=n;i>=1;i--)
{
if(flag[i]==1)
{
cout<<c[i];
num--;
if(num>0)
cout<<" ";
}
}
}
return 0;
}