以前一想到学贪心的时候学到了,其实贪心算法的应用是前提的,在当前情况的币值下,例如我们常见 1,2 ,5,10都是精心设计的。其实大多数应该用动态规划,当然本文只用了搜素。具体思路看下面的连接。
硬币找零不就是整数分解
#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; }