UVA 147
来源:互联网 发布:源码安装php选项 编辑:程序博客网 时间:2024/05/13 13:59
题目大意:
给定11种面值分别为$100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins的钱,现在给定一个钱数,求出可以组成的种类数,类似于uva 674,不过此题的精度太强了
int n=(int)(nn*100+0.5);,注意用long long ,种类数可能非常大
用dp[i][j]表示用前i种硬币,组成j分的种类数,
状态转移方程:dp[i][j]+=DP(i-1,j-k*d[i]);
AC代码: cop
- #include<stdio.h>
- #define N 30005
- #include<string.h>
- #define ll long long
- int d[11]= {5,10,20,50,100,200,500,1000,2000,5000,10000};
- ll dp[15][N];//dp[i][j]表示用前i种硬币,组成j分的种类数
- ll DP(ll i,ll j)
- {
- //printf("%d %d %d\n",i,j,dp[i][j]);
- if(dp[i][j]!=-1)
- return dp[i][j];
- dp[i][j]=0;
- for(int k=0;j-k*d[i]>=0;k++)
- {
- dp[i][j]+=DP(i-1,j-k*d[i]);
- }
- return dp[i][j];
- }
- int main()
- {
- double nn;
- memset(dp,-1,sizeof(dp));//赋值一次即可,否则可能会超时
- while(scanf("%lf",&nn)!=EOF)
- {
- if(nn==0.00)
- break;
- int n=(int)(nn*100+0.5);//注意精度
- for(ll i=0; i<=n; i++)
- dp[0][i]=1;
- printf("%6.2f%17lld\n",nn,DP(10,n));
- }
- return 0;
- }
递推代码:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn=30001;
- int num[12]={0,5,10,20,50,100,200,500,1000,2000,5000,10000};
- int a,b;
- long long f[maxn][12];
- void Init()
- {
- for(int i=0;i<12;i++)
- f[0][i]=1;
- for(int i=1;i<maxn;i++)
- for(int j=1;j<12;j++)
- for(int k=0;num[j]*k<=i;k++)
- f[i][j]+=f[i-num[j]*k][j-1];
- }
- int main()
- {
- Init();
- while(scanf("%d.%d",&a,&b)&&(a+b))
- {
- int n=a*100+b;
- printf("%6.2lf%17lld\n",n*1.0/100,f[n][11]);
- }
- return 0;
- }
背包代码:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn=30005;
- int a,b,num[12]={5,10,20,50,100,200,500,1000,2000,5000,10000};
- long long f[maxn];
- void Init()
- {
- f[0]=1;
- for(int i=0;i<11;i++)
- for(int j=num[i];j<maxn;j++)
- f[j]+=f[j-num[i]];
- }
- int main()
- {
- Init();
- while(scanf("%d.%d",&a,&b)&&(a+b))
- {
- int n=a*100+b;
- double ans=n*1.0/100.0;
- printf("%6.2lf%17lld\n",ans,f[n]);
- }
- return 0;
- }
递推代码:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn=30001;
- int num[12]={0,5,10,20,50,100,200,500,1000,2000,5000,10000};
- int a,b;
- long long f[maxn][12];
- void Init()
- {
- for(int i=0;i<12;i++)
- f[0][i]=1;
- for(int i=1;i<maxn;i++)
- for(int j=1;j<12;j++)
- for(int k=0;num[j]*k<=i;k++)
- f[i][j]+=f[i-num[j]*k][j-1];
- }
- int main()
- {
- Init();
- while(scanf("%d.%d",&a,&b)&&(a+b))
- {
- int n=a*100+b;
- printf("%6.2lf%17lld\n",n*1.0/100,f[n][11]);
- }
- return 0;
- }
背包代码:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn=30005;
- int a,b,num[12]={5,10,20,50,100,200,500,1000,2000,5000,10000};
- long long f[maxn];
- void Init()
- {
- f[0]=1;
- for(int i=0;i<11;i++)
- for(int j=num[i];j<maxn;j++)
- f[j]+=f[j-num[i]];
- }
- int main()
- {
- Init();
- while(scanf("%d.%d",&a,&b)&&(a+b))
- {
- int n=a*100+b;
- double ans=n*1.0/100.0;
- printf("%6.2lf%17lld\n",ans,f[n]);
- }
- return 0;
- }
0 0
- UVa 147
- uva 147
- UVA 147
- UVA 147
- UVA 147 - Dollars
- uva 147 Dollars
- uva 147 Dollars
- UVa 147Dollars
- Uva 147 Dollars
- UVA 147 Dollars
- UVa 147 Dollars 解答
- UVa 147 - Dollars
- UVa 147 - Dollars
- uva 147 coins
- UVa 147 - Dollars 背包
- uva 147 - Dollars
- UVa 147 - Dollars
- UVa 147 - Dollars
- Webview与原生交互传值
- Android--高德地图自动定位
- 高质量C编程01-回顾
- sqlplus 导出导入 存储过程,包体
- sql语句常见的操作符学习整理(后边遇见会加上)
- UVA 147
- Android Studio下编译lame
- 自定义简单的android阴影引导工具类
- iOS GCD的使用
- 【Arduino官方教程第一辑】示例程序 4-1 ASCIl表
- PHP递归与非递归实现二分查找
- Levmar使用小结(一)
- Android Design Support Library--FloatingActionButton及其Behavior的使用
- <<程序员面试宝典>>读书笔记 6