入门硬币问题
2012-06-12 20:35
155 查看
第一题:给出n个硬币,不同值,每一个价值的硬币有无数个,求最多硬币数刚好凑到价值为S的硬币数,,,?最少又是多少?
方法:1、用递归方法,两种情况得分别写,注意把每一个有没有计算过的值给记录。这种方法容易搞混。dp1(),dp2();
2、用二维数组迭代:注意顺序dp()
方法:1、用递归方法,两种情况得分别写,注意把每一个有没有计算过的值给记录。这种方法容易搞混。dp1(),dp2();
2、用二维数组迭代:注意顺序dp()
#include<iostream> #include<cstdio> #include<cstring> #include<ctype.h> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<string> //#include<map> #include<stack> using namespace std; #define N 100 #define Inf 100000000 int s; int c ; int d[N*N]; int n; int dp1(int i) { //cout<<i<<endl; int &ans=d[i]; if (ans!=-1) return ans; ans=-1<<30; for (int j=1;j<=n;j++) { if (i>=c[j]) ans=max(ans,dp1(i-c[j])+1); } return ans; } int dp2(int i) { int &ans=d[i]; if (ans!=-1) return ans; ans=1<<30; for (int j=1;j<=n;j++) { if (i>=c[j]) { ans=min(ans,dp2(i-c[j])+1); } } return ans; } void dp() { int small[N*N],big[N*N]; small[0]=0; big[0]=0; for (int i=1;i<=s;i++) { small[i]=Inf; big[i]=-Inf; } int path_small[N*N]; int path_big[N*N]; for (int i=1;i<=s;i++) { for (int j=1;j<=n;j++) { if (i>=c[j]) { if (small[i]>small[i-c[j]]+1) { small[i]=small[i-c[j]]+1; path_small[i]=j; } if (big[i]<big[i-c[j]]+1) { big[i]=big[i-c[j]]+1; path_big[i]=j; } } } } cout<<"The big one is : "<<big[s]<<endl; int cur=s; while (cur) //打印用的是哪些硬币 { cout<<c[path_big[cur]]<<' '; cur-=c[path_big[cur]]; } cout<<endl; cout<<"The small one is: "<<small[s]<<endl; cur=s; while (cur) { cout<<c[path_small[cur]]<<' '; cur-=c[path_small[cur]]; } cout<<endl; } void print(int k) { for (int i=1;i<=n;i++) { if (k>=c[i]&&d[k]==d[k-c[i]]+1) { cout<<c[i]<<' '; print(k-c[i]); break; } } } int main() { freopen("fuck.txt","r",stdin); int i,j,k; int num=0; while (cin>>n>>s,n) { num++; for (i=1;i<=n;i++) cin>>c[i]; if (0) dp(); else { memset(d,-1,sizeof(d)); d[0]=0; cout<<"#Case "<<num<<" is :"<<endl; cout<<"The big one is: "<<dp1(s)<<endl; print(s); //打印 cout<<endl; memset(d,-1,sizeof(d)); d[0]=0; cout<<"The small one is: "<<dp2(s)<<endl; print(s); cout<<endl; cout<<endl; //打印也是从0开始找到第一个, } } return 0; }
相关文章推荐
- 动态规划入门之硬币问题
- 动态规划入门之硬币找零问题
- 动态规划入门之硬币问题
- HDU 2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)
- DP DAG 9-3硬币问题(算法竞赛入门经典p162)
- DP入门系列二--DAG之二最短路(硬币问题)
- 入门经典 例题9-3 硬币问题
- 动态规划入门之硬币问题(转)
- 入门经典--硬币问题dp递归加递推
- 算法竞赛入门经典 例题9-3 硬币问题
- PowerDesigner16.5快速入门显示,注释comment配置方法,以及创建sql文件过程中需要注意的一些问题
- poj 3984 迷宫问题 (bfs入门)
- 取硬币问题最优策略
- XAJAX学习日记----入门及中文问题
- asp.net开发webservice 入门问题总结
- sleepSort和硬币概率问题
- spring入门编程问题集锦
- nodejs 入门关于文件上传的问题
- Windows驱动开发入门遇到的问题和困难
- [贪心入门]活动安排问题