UVA - 147 Dollars(完全背包)

来源:互联网 发布:ubuntu试用root密码 编辑:程序博客网 时间:2024/06/06 08:46
题目大意:
给定11种面值分别为$100, $50, $20, $10, $5, $2, $1, 50c, 20c, 10c , 5c 的钱,现在给定一个钱数,求出可以组成的种类数。

解析:
类似于uva 674,不过此题的精度太强了。
int n=(int)(nn*100+0.5); 注意用long long ,种类数可能非常大
用dp[v]表示:当前价格用的方法个数

状态转移方程:dp[v + coin[i]] += dp[v];

#include <cstdio>#include <cstring>using namespace std;typedef long long ll;const int N = 50000;const int coin[11] = {5,10,20,50,100,200,500,1000,2000,5000,10000};ll dp[N];int main() {memset(dp,0,sizeof(dp));dp[0] = 1;for(int i= 0; i < 11; i++) {for(int v = 0; v < N - 15000; v++) {dp[v+coin[i]] += dp[v];}}double val;while(scanf("%lf",&val) != EOF) {ll v = (val * 100 + 0.5);if(v == 0) {break;}printf("%6.2lf%17lld\n",val,dp[v]);}return 0;}


0 0