UVA 10313 Pay the Price
来源:互联网 发布:郑州经济数据造假 编辑:程序博客网 时间:2024/05/21 09:54
题目大意:提供面额1~300的硬币(美元硬币这题性质一样),题目有三种输入,分别是:
1,输入N——输出1~300硬币组成N的方案数;
2,输入N,L1——输出组成N的方案数中,硬币数不超过L1的方案数;
3,输入N,L1,L2——输出组成N的方案数中, L1 <= 硬币数 <= L2的方案数;
解题策略:重要结论,组合N硬币数不超过L1的方案数 = 组合N硬币面额最大不超过L1的方案数;
上述结论可通过Ferrers图证明(这货是组合数学里的东西,小菜不懂啊。。);
所以通过该结论,这题就可以uva 674 Coin Change联系起来。
由于是dp基础题,所以就不献丑谈算法了,说下注意点和不同点吧:
1,解决输入问题,网上都是用sscanf()函数,由于不熟悉,就用字符流解决了;
2,在判断上下限时,必须考虑上限超过300这种坑爹数据(用min函数解决);
3,当价格为0而且下限为0时,只要一种组合方案;
算法的晦涩复杂和美妙无比都在一瞬之间啊,最后谢谢周B捷童鞋~
/* UVA 10313 Pay the Price AC by J.Dark ON 2013/3/15 Time 0.404s*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <sstream>#include <algorithm>const int maxn = 310;using namespace std;unsigned long long int dp[maxn][maxn];int N, L1, L2;int price, minNum, maxNum; char temp[100];void solve(){ memset(dp, 0, sizeof(dp)); dp[0][0]=1; for(int i=0; i<=300; i++) {dp[0][i] = 1;} for(int j=1; j<=300; j++){ for(int i=1; i<=300; i++){ dp[i][j] = dp[i][j-1]; if(i-j >= 0) {dp[i][j] += dp[i-j][j];} } } }////////////////////////int main(){ solve(); while(gets(temp)!=NULL) { int num, tc = 0; //定义字符流,分割数字 stringstream ss(temp); while(ss >> num && tc <=3) { tc++; if(tc == 1) price = num; if(tc == 2) L1 = num; if(tc == 3) L2 = num; } //根据数字情况判断硬币数上下限 if(tc == 1) {maxNum = 300; minNum = 0;} if(tc == 2) {maxNum = min(300, L1); minNum = 0;} if(tc == 3 ) {minNum = L1, maxNum = min(300, L2);} //特判 if(price == 0 && minNum == 0) {cout << 1 << endl;} else {cout << dp[price][maxNum]-dp[price][minNum-1]<< endl;} } //system("pause"); return 0;}
- uva 10313 Pay the Price
- UVA 10313 Pay the Price
- UVA 10313 Pay the Price
- uva 10313 - Pay the Price
- UVA - 10313 Pay the Price
- UVa:10313 Pay the Price
- uva 10313 - Pay the Price
- UVa 10313 - Pay the Price
- UVA - 10313 Pay the Price
- UVA - 10313 Pay the Price
- uva 10313 Pay the Price
- UVA 10313-Pay the Price(DP)
- uva 10313 Pay the Price (DP)
- Pay the Price+uva+dp
- 10313 - Pay the Price
- 10313 - Pay the Price
- 解题报告(一):uva 10313 - Pay the Price (dp)
- uva 10313 Pay the Price(完全背包)
- oracle sql 3
- 如果你不引用,是我的失败
- 简单工厂模式
- 为什么有了wait函数族还需要SIGCHLD信号
- js实现模拟数字密码输入键盘
- UVA 10313 Pay the Price
- 【Android】应用获取用户最高权限
- oralce sql 4
- 关于二维数组测试浅析
- PHP获取IP地址所在地信息(使用纯真IP数据库qqwry.dat)
- Solr原理
- 一些免费的API
- 位图和矢量图区别
- 十种排序方法