当前位置:编程学习 > C/C++ >>

uva 357 - Let Me Count The Ways 和 uva 147 - Dollars


题目意思: 和uva  674一样,都是求总方案数
解题思路: 动态规划

357
解题思路:动态规划,uva674的同类型题,但是这一题的数据n最大到30000
那么如果一直累加中间过程和是会超过int这个地方WA了N次,所以我们必须用
unsigned long long ,其它还要注意方案数为1的时候输出比较不同

代码:
[cpp] 
#include <algorithm> 
#include <iostream> 
#include <cstring> 
#include <string> 
#include <vector> 
#include <cstdio> 
#include <stack> 
#include <queue> 
#include <cmath> 
using namespace std; 
#define MAXN 30010 
 
int type[5] = {1,5,10,25,50}; 
unsigned long long  dp[MAXN]; 
int n; 
 
//打表处理好所有的数据 
void solve(){ 
    memset(dp , 0 , sizeof(dp)) ; dp[0] = 1; 
    for(int i = 0 ; i < 5 ; i++){ 
        for(int j = 1 ; j < MAXN ; j++){ 
          if(j-type[i] >= 0) dp[j] += dp[j-type[i]]; 
       } 
    } 

 
int main(){ 
    //freopen("input.txt" , "r" , stdin); 
    solve(); 
    while(scanf("%d" , &n) != EOF) { 
        if(dp[n] > 1) printf("There are %llu ways to produce %d cents change.\n" , dp[n] , n); 
        else printf("There is only 1 way to produce %d cents change.\n" , n); 
    } 
    return 0; 

147
1:由于这题的数据最大为30000,那么如果累加的话中间值会超过int ,需要用unsigned long long才不会错(long long 还是WA)
2:由于double类型换成整型(int s = double * 100这个是不准确的)的时候存在精度缺失,所以我们输入的时候要用两个整数,而不是double,最后输出时候注意一下格式

代码:
[cpp]
#include <algorithm> 
#include <iostream> 
#include <cstring> 
#include <string> 
#include <vector> 
#include <cstdio> 
#include <stack> 
#include <queue> 
#include <cmath> 
using namespace std; 
#define MAXN 30010 
 
unsigned long long dp[MAXN]; 
int  currency[11] = {5,10,20,50,100,200,500,1000,2000,5000,10000}; 
 
void solve(){ 
    int i , j; 
    memset(dp , 0 , sizeof(dp)) ; dp[0] = 1;  
     
    for(i = 0 ; i < 11 ; i++){ 
        for(j = 1 ; j <= MAXN ; j++){ 
            if(j-currency[i]>=0) dp[j] += dp[j-currency[i]]; 
        } 
    } 

 
int main(){ 
    //freopen("input.txt" , "r" , stdin); 
    solve(); 
    int n , m , s; 
    while(scanf("%d.%d" , &n , &m)){//输入格式 
        s = n*100+m; 
        if(s == 0) break; 
        printf("%3d.%.2d%17llu\n" , n , m , dp[s]);//输出注意格式,前面占6个宽,后面17个宽 
    } 
    return 0; 

 

 


作者:cgl1079743846
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,