码迷,mamicode.com
首页 > 其他好文 > 详细

PAT (Advanced Level) Practice 1068 Find More Coins

时间:2020-01-24 23:46:28      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:its   use   span   amp   system   序号   比较   ice   names   

题解

  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?\n: );
    }
    else
        printf("No Solution\n");

    system("pause");
    return 0;
}

PAT (Advanced Level) Practice 1068 Find More Coins

标签:its   use   span   amp   system   序号   比较   ice   names   

原文地址:https://www.cnblogs.com/VividBinGo/p/12232673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!