zoukankan      html  css  js  c++  java
  • 硬币找零问题

    以前一想到学贪心的时候学到了,其实贪心算法的应用是前提的,在当前情况的币值下,例如我们常见 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;
    }
  • 相关阅读:
    初级算法梳理 -【任务1 线性回归算法梳理】
    【转】netstat 查看端口占用情况
    【转】Linux多命令顺序执行连接符(; || && |)
    【摘】程序员保持竞争力方法
    【整理】python中re的match、search、findall、finditer区别
    【转】怎样理解阻塞非阻塞与同步异步的区别?
    [笔记]Docker解决了什么问题?
    【笔记】第六章、Linux 的文件权限与目录配置
    [整理]Python程序员面试前需要看的博客(持续整理)
    【整理】知乎回答:为什么计算机语言中的变量名都不能够以数字为开头呢?
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3810825.html
Copyright © 2011-2022 走看看