2 solutions

  • 4
    @ 2024-3-13 13:16:17

    DP 入门题

    题意

    有面值 1,5,11 的三种硬币,求付 nn 元钱硬币数量最少

    思路

    ii 元钱时,可以:

    • 5 张 1 元换成 1 张 5 元
    • 11 张 1 元换成 1 张 11 元

    然后取硬币数最少的选项加 1

    代码(DP)

    #include <bits/stdc++.h>
    using namespace std;
    int a[1000005];
    int main(int argc, char **argv){
    	int n;
    	cin >> n;
    	for (int i = 1;i <= n;i++){
    		if (i < 5){	// 钱数小于 5
    			a[i] = a[i - 1] + 1;
    		}else if (i < 11){	// 钱数大于 5,小于 11
    			a[i] = min(a[i - 1],a[i - 5]) + 1;
    		}else{	// 钱数大于 11
    			a[i] = min({a[i - 1],a[i - 5],a[i - 11]}) + 1;
    		}
    	}
    	cout << a[n];
    	return 0;
    }
    

    代码(DFS)

    #include <bits/stdc++.h>
    using namespace std;
    int a[1000005];
    int dfs(int n){
        if (a[n])   return a[n];
    	if (n <= 0)	return a[n] = 0;
    	else if (n == 1){
    		return a[n] = 1;
    	}else if(n < 5){
    		return a[n] = dfs(n - 1) + 1;
    	}else if (n < 11){
    		return a[n] = min(dfs(n - 5),dfs(n - 1)) + 1;
    	}
    	return a[n] = min({dfs(n - 5),dfs(n - 1),dfs(n - 11)}) + 1;
    }
    int main(){
    	int n;
    	cin >>n;
    	cout << dfs(n);
    	return 0;
    }
    

    Information

    ID
    1021
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    7
    Tags
    # Submissions
    67
    Accepted
    14
    Uploaded By