硬币找零问题

以前一想到学贪心的时候学到了,其实贪心算法的应用是前提的,在当前情况的币值下,例如我们常见 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;
}
posted @ 2014-06-26 20:50  hansongjiang8  阅读(529)  评论(0编辑  收藏  举报