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的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced Level 1043

PAT Advanced Level 1079

PAT Advanced Level 1095

PAT Advanced Level 1038

pat advanced level 1063

PAT Advanced level 1003 Emergency