PAT甲级1048 Find Coins

PAT甲级1048 Find Coins_第1张图片
题意:
给你n个面值范围为【1,500】之间的硬币,然后要求两个硬币相加结果为m(注意这里只允许是两个硬币,并且第一个硬币的币值需要小于等于第二个硬币)
解题思路:
1.考虑到题目对于时间复杂度要求较高,因此对于每两两硬币遍历是不可取的O(n*n),我采用对硬币币值进行遍历O(500*500)
2.coinnum存取每种硬币存在的个数,用于在遍历过程中,存在两个币值相等的硬币相加问题
3.result中的索引为每两两硬币相加的所有可能【2,1000】,初值设为1005,意思为该种可能在题目给的数据中不存在
代码:

#include
#include
#include
using namespace std;
int main()
{
    int coinnum[505];//每种币值存在的个数
    map<int,int> result;//索引为m,结果为最后输出的第一个值
    for(int i=0;i<=1000;i++)result[i]=1005;
    for(int i=0;i<505;i++)coinnum[i]=0;
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        int temp;
        scanf("%d",&temp);
        coinnum[temp]+=1;
    }
    for(int i=1;i<=500;i++)
    {
        int temp=i;
        if(coinnum[i]>0)//存在该面值硬币
        {
            coinnum[i]--;
            for(int j=i;j<=500;j++)
            {
                if(coinnum[j]>0)
                {
                    if(temp<result[temp+j])result[temp+j]=temp;
                }
            }
            coinnum[i]++;
        }
    }
    if(result[m]!=1005)//存在结果
    printf("%d %d",result[m],m-result[m]);
    else printf("No Solution");
    return 0;
}

PAT甲级1048 Find Coins_第2张图片
可以看到时间复杂度较低O(500*500)

你可能感兴趣的:(PAT甲级)