2025年华南理工大学计算机考研复试机试真题
2025年华南理工大学计算机考研复试上机真题
历年华南理工大学计算机考研复试上机真题
历年华南理工大学计算机考研复试机试真题
更多学校题目开源地址:https://gitcode.com/verticallimit1/noobdream
N 诺 DreamJudge 题库:输入 “学校名称” 即可筛选该校历年机试真题,题目均在考纲范围内,按难度自动排序。还可搭配《计算机考研机试攻略》刷题,书中题目可通过题号直接在题库中查找。

凑零钱
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了 6 种钱币面值为 2、5、10、20、50、100,用来凑 15 元,可以用 5 个 2 元、1个 5 元,或者 3 个 5 元,或者 1 个 5 元、1个 10 元,等等。显然,最少需要 2 个钱币才能凑成 15 元。你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
输入输出格式
输入描述:
第一行是待凑的钱数值 M(1 <= M<= 2000,整数),接着的一行中,第一个整数 K(1 <= K <= 10)表示币种个数,随后是 K个互不相同的钱币面值 Ki(1 <= Ki <= 1000)。输入 M=0 时结束。
输出描述:
每个测试用例输出一行,即凑成钱数值 M 最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
输入输出样例
输入样例#:
15 6 2 5 10 20 50 100
输出样例#:
2
代码一
- #include<bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int m, k;
- void work(){
- while(cin>>m&&m!=0){
- cin>>k;
- int a[15];
- for(int i=1;i<=k;i++) cin>>a[i];
- int f[2500];
- memset(f, 0x3f, sizeof f);
- f[0]=0;
- for(int i=1;i<=k;i++){
- int x=a[i];
- for(int j=0;j<=m;j++){
- for(int y=0;y<=j;y+=x){
- f[j]=min(f[j], f[j-y]+y/x);
- }
- }
- }
- if(f[m]==INF) cout<<"Impossible"<<endl;
- else cout<<f[m]<<endl;
- }
- }
- int main(){
- work();
- return 0;
- }
代码二
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <math.h>#include <ctype.h>int main(){int m;while(scanf("%d",&m)!=EOF){int n;scanf("%d",&n);int value[n];for(int i=0; i<n; i++){scanf("%d",&value[i]);}int dp[m];dp[0]=0;for(int i=1; i<=m; i++){dp[i]=999999;}for(int i=0; i<n; i++){for(int j=value[i]; j<=m; j++){if(dp[j-value[i]]!=999999){dp[j]=dp[j]<(dp[j-value[i]]+1)?dp[j]:(dp[j-value[i]]+1);}}}if(dp[m]==999999){printf("Impossible\n");}else{printf("%d\n",dp[m]);}}return 0;}
代码三
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int main() {
- int m;
- while (cin >> m && m != 0) { // 循环读取每个测试用例,直到m为0
- int k;
- cin >> k; // 读取币种个数
- vector<int> coin(k);
- for (int i = 0; i < k; ++i) {
- cin >> coin[i];
- }
- vector<int> dp(m + 1, 1001); // 初始化为较大的数
- dp[0] = 0; // 初始化边界条件
- for (int i = 0; i < k; ++i) {
- for (int j = coin[i]; j <= m; ++j) {
- dp[j] = min(dp[j], dp[j - coin[i]] + 1);
- }
- }
- if (dp[m] != 1001) {
- cout << dp[m] << endl;
- } else {
- cout << "Impossible" << endl;
- }
- }
- return 0;
- }
505

被折叠的 条评论
为什么被折叠?



