206. 硬币问题 II(挑战程序设计竞赛)


地址 https://www.papamelon.com/problem/206

解法
硬币选择贪心方案,假设有两种解答方案 贪心解和非贪心解
1 非贪心和贪心解 都有解法的情况
由于 贪心是优先选择小于等于总需求面值的最大面值硬币, 它是用的硬币数量是G枚硬币
非贪心有解 但是他选择小于等于总需求面值的最大面值硬币数目是小于或者等于贪心选择的数目, 那么他最后使用的硬币数量也是小于等于G的
也就是非贪心的解可能是最优解 也可能不是最优解

2 有没可能存在非贪心有解 贪心误解的情况
不可能 这是由于硬币面值决定的。任意一个硬币来说,它能被它左边的任意一个硬币面值整除。 也就是多个小硬币的累加值如果等于大硬币的值,就可以转化成选择大硬币,减少最后的选择硬币数目(贪心). 每个非贪心的解都可以转化成贪心解

3 非贪心无解 贪心无解的情况
不可能 题目规定肯定有解

4 非贪心无解 贪心有解 不谈论,那肯定贪心是最优解

上面 1 2 3 一定有解 且贪心解一定优于或者等于非贪心解。 所以贪心解在保证有解的情况 一定最优.

#include 
#include 

using namespace std;

int val[6] = {1,5,10,50,100,500};
int arr[6];
int n,t;

int main(){
    cin>>t;
    while(t--){
        memset(arr,0,sizeof arr);
        for(int i = 0;i < 6;i++) cin >> arr[i];
        cin >> n;
        int ans =0;
       
        for(int i = 5;i>=0;i--){
            if(arr[i] !=0){
                int cost = min(arr[i], n/val[i]);
                n-= cost*val[i];
                ans+=cost;
            }
             
        }    
        cout << ans<

我的视频题解空间