• 硬币找零问题


    以前一想到学贪心的时候学到了,其实贪心算法的应用是前提的,在当前情况的币值下,例如我们常见 1,2 ,5,10都是精心设计的。其实大多数应该用动态规划,当然本文只用了搜素。具体思路看下面的连接。

    http://www.acmerblog.com/dp6-coin-change-4973.html根据这个博客学习了下,我是按照我以前写的整数分解来写的,其实主要是分解的时候防止重复 例如
    1 2 和 2 1是一样的,在整数分解中用的是保证数组是递增的,如 10分解 现实 1 1 2 后面的数都大于等于前面的数,

    硬币找零不就是整数分解

    #include<stdio.h>
    #include<iostream>
    #include <vector>
    using namespace std;
    int count( int S[], int m, int n )
    {
        // 如果n为0,就找到了一个方案
        if (n == 0)
            return 1;
        if (n < 0)
            return 0;
        // 没有硬币可用了,也返回0
        if (m <=0 )
            return 0;
        // 按照上面的递归函数
        return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
    }
    int count1(int S[],int len,int left,int ans[],int lev)//ans lev配合使用,取得答案,可以使用vertor
    {
        if(left<0) return 0;
        if(left==0)
        {
           

            return 1;
        }
        int sum=0;

        for(int k=0;k<len;k++)
        {
           
            if(ans[lev]<=S[k])
            {
                ans[lev+1]=S[k];
               
            int a=count1(S,len,left-S[k],ans,lev+1);

        //    cout<<a<<endl;
                sum+=a;
            }
        
            
       
       
        }

        return sum;
    }

    // 测试
    int main()
    {
        int i, j;
        int arr[] = {1, 2, 3,5,6,7,8,9};
        int m = sizeof(arr)/sizeof(arr[0]);
        printf("%d ", count(arr, m, 14));
        vector<int> v;
        int *ans=new int[20];
        ans[0]=-1;
        cout<<"my code:::"<<count1(arr,m,14,ans,0)<<endl;
        getchar();
        return 0;
    }

    #include<stdio.h>
    #include<iostream>
    #include <vector>
    using namespace std;
    int count( int S[], int m, int n )
    {
        // 如果n为0,就找到了一个方案
        if (n == 0)
            return 1;
        if (n < 0)
            return 0;
        // 没有硬币可用了,也返回0
        if (m <=0 )
            return 0;
        // 按照上面的递归函数
        return count( S, m - 1, n ) + count( S, m, n-S[m-1] );
    }
    int count1(int S[],int len,int left,int ans[],int lev)//ans lev配合使用,取得答案,可以使用vertor
    {
        if(left<0) return 0;
        if(left==0)
        {
            
    
            return 1;
        }
        int sum=0;
    
        for(int k=0;k<len;k++)
        {
            
            if(ans[lev]<=S[k])
            {
                ans[lev+1]=S[k];
                
            int a=count1(S,len,left-S[k],ans,lev+1);
    
        //    cout<<a<<endl;
                sum+=a;
            }
         
             
        
        
        }
    
        return sum;
    }
    
    
    
    
    
    // 测试
    int main()
    {
        int i, j;
        int arr[] = {1, 2, 3,5,6,7,8,9};
        int m = sizeof(arr)/sizeof(arr[0]);
        printf("%d ", count(arr, m, 14));
        vector<int> v;
        int *ans=new int[20];
        ans[0]=-1;
        cout<<"my code:::"<<count1(arr,m,14,ans,0)<<endl;
        getchar();
        return 0;
    }
  • 相关阅读:
    Object C学习笔记25-文件管理(一)
    实施项目--为什么开发人员一直在抱怨需求变动
    Git.Framework 框架随手记--准备工作
    一网打尽!2018网络安全事件最全的盘点
    林纳斯·托瓦兹和Linux行为准则:揭穿7个谬论
    LinkedList源码解析
    四种List实现类的对比总结
    HashMap源码解析
    volatile
    Java内存模型与共享变量可见性
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3810825.html
Copyright © 2020-2023  润新知