找零

题目链接

思路:

 这个题就是求能恰好构成 >= 给出钱数的最小值和最小硬币数量,且能支付的钱最少为第一优先级。
 就是一个恰好装满的01背包问题
dp[j] 表示 恰好能组成 j元钱所花费的最小硬币数
求出dp数组后,我们从给出的价值V开始遍历,找到第一个 恰好能由硬币组成的且大于V的值,并将组成它的最小硬币数输出即可

#include <bits/stdc++.h>
#define ss system("pause");

using namespace std;

const int maxn = 1e2 + 5;
const int maxc = 1e6 + 5;
const int inf = 1e9 + 7;

int dp[maxc],v[maxn];

void Solve(int bag,int num,int c)
{
    for(int i = 1; i <= bag; i++) dp[i] = inf;
    dp[0] = 0;
    for(int i = 1; i <= num; i++){
        for(int j = bag; j >= v[i]; j--){
            dp[j] = min(dp[j - v[i]] + 1,dp[j]);
        }
    }
    for(int i = c; i <= bag; i++){
        if(dp[i] < inf){
            cout<<i<<' '<<dp[i]<<endl;
            break;
        }
    }
}

int main()
{
    int t;
    cin>>t;
    while(t--){
        int C,n;
        cin>>C>>n;
        int sum = 0;
        for(int i = 1; i <= n; i++){
            cin>>v[i];
            sum += v[i];
        }
        Solve(sum,n,C);
    }
    return 0;
}
                     

猜你喜欢

转载自blog.csdn.net/CUCUC1/article/details/109901675