PAT (Advanced Level) Practice 1068 Find More Coins
Posted vividbingo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT (Advanced Level) Practice 1068 Find More Coins相关的知识,希望对你有一定的参考价值。
题解
01背包板子 + 记录路径。这次的记录路径比较特殊,要从多组解中找到一组由尽量小价值的硬币组成的解。所以不能利用一维数组记录路径,path[目前重量] = 物品序号,因为这样最后只能记录一个可能符合或不符合要求解。所以应该利用二维数组记录路径,path[ 物品序号 ][ 目前重量 ] = 1,这样可以记录多组解。因为要求为找到最小的一组解,所以先将拥有的硬币从大到小排序,以便于进行01背包时,可以从大到小更新解。
代码
#include<bits/stdc++.h>
using namespace std;
int dp[150],coin[10005],path[10005][150];
int main()
{
int i,j,N,M,index;
vector<int> ans;
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++)
scanf("%d",&coin[i]);
sort(coin+1,coin+N+1,greater<int>());
for(i=1;i<=N;i++)
{
for(j=M;j>=coin[i];j--)
{
if(dp[j]<=dp[j-coin[i]]+coin[i])
{
dp[j]=dp[j-coin[i]]+coin[i];
path[i][j]=true;
}
}
}
index=N;
if(dp[M]==M)
{
while(M)
{
if(path[N][M])
{
ans.push_back(coin[N]);
M-=coin[N];
}
N--;
}
sort(ans.begin(),ans.end());
for(i=0;i<ans.size();i++)
printf("%d%c",ans[i],i==ans.size()-1?‘
‘:‘ ‘);
}
else
printf("No Solution
");
system("pause");
return 0;
}
以上是关于PAT (Advanced Level) Practice 1068 Find More Coins的主要内容,如果未能解决你的问题,请参考以下文章