zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java基础(一)-----java的三大特性之封装
    并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析
    深入并发包 ConcurrentHashMap 源码解析
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12232673.html
Copyright © 2011-2022 走看看