首页 > 试题广场 >

日本旅行

[编程题]日本旅行
  • 热度指数:1209 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
楚乔、宇文玥和燕洵在日本旅行,经过了几天的游玩之后,钱包里出现了大量硬币,楚乔决定用钱包里的硬币为宇文玥和燕洵在自动贩卖机买水。楚乔的钱包里有1元、5元、10元、50元、100元和500元硬币各C1,C5,C10,C50,C100,C500枚。现在要用这些硬币来到自动贩卖机买价格为A的饮料,假设自动贩卖机所需的硬币金额必须是刚刚好,不能多也不能少,最少需要多少枚硬币?

限制条件

0≤ C1,C5,C10,C50,C100,C5001000000000

0A1000000000

依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔,输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY



输入描述:
依次输入C1,C5,C10,C50,C100,C500和A,以空格分隔


输出描述:
输出最少所需硬币数,如果该金额不能由所给硬币凑出,则返回NOWAY
示例1

输入

3 2 1 3 0 2 620

输出

6
超出内存上限了,
#include <stdio.h>

int main() {
    int a, b;
    int cash;
    int coin[6]={1,5,10,50,100,500};
    int coin_num[6]={0};

    scanf("%d", &coin_num[0]);
    scanf("%d", &coin_num[1]);
    
    scanf("%d", &coin_num[2]);
    scanf("%d", &coin_num[3]);
    scanf("%d", &coin_num[4]);
    scanf("%d", &coin_num[5]);
    scanf("%d", &cash);
    
  

    int dp[10000][6]={0};
    dp[1][0]=1;//c1 coin_num[0] 凑一块钱就一种
    for (int j=0; j<=cash; j++) {
        if (j<=coin_num[0]*coin[0]) {
            dp[j][0]=1;
        }
    }
    for (int i=0; i<=cash; i++) {
        for (int j=1; j<6; j++) {
            if (coin[j]>i) {
                dp[i][j]=dp[i][j-1];
            }else if (i%coin[j]==0&&i/coin[j]<=coin_num[j]){
                if (coin_num[j]>0) {
                dp[i][j]=i/coin[j];
                }else {
                    dp[i][j]=dp[i][j-1];
                }
                    
            }
            else {
                int k=1;
                if (dp[i][j-1]!=0) {
                dp[i][j]=dp[i][j-1];
                }else {
                dp[i][j]=cash;
                }
                
                    while (i-k*coin[j]>=0&&k<=coin_num[j]) {
                        if (dp[i-k*coin[j]][j-1]!=0) {
                            dp[i][j]=dp[i][j]<(dp[i-k*coin[j]][j-1]+k)?dp[i][j]:(dp[i-k*coin[j]][j-1]+k);
                        }
                        k++;
                    }
                if (dp[i][j]==cash) {
                dp[i][j]=0;
                }
            }
        }
    
    }

     if (dp[cash][5]==0) {
     printf("NOWAY\n");
     }else {
        printf("%d\n",dp[cash][5]); 
     }

    
    return 0;
}

发表于 2025-03-15 20:38:45 回复(0)