您的位置:首页 > 其它

POJ 3181 Dollar Dayz

2015-08-28 19:01 211 查看
POJ 3181 Dollar Dayz

农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案?

刚开始的思路是:DP[i][j]=DP[i-1][j]+DP[i-1][j-i]+DP[i-1][j-2i]+DP[i-1][j-3i]+.......(后来发现优化递推式:DP[i][j]=DP[i-1][j]+DP[i][j-i])

可提交后发现不能AC,网上看了以后知道是大数问题。下面展示一大神代码。学习大数的表示:

#include <iostream>
using namespace std;

// 0高位 1低位
unsigned long long dp[100 + 16][1000 + 16][2];   // dp[i][j] := 用i种价格配出金额j的方案数
#define LIMIT_ULL 10000000

int main()
{
int N, K;
cin >> N >> K;
for (int i = 1; i <= K; ++i)
{
dp[i][0][1] = 1;
for (int j = 1; j <= N; ++j)
{
//由于优化后的递推式:dp[i][j] = dp[i – 1][j] + dp[i][j – i],所以要加上这个循环
if (j < i)
{
dp[i][j][0] = dp[i - 1][j][0];
dp[i][j][1] = dp[i - 1][j][1];
}
else
{
dp[i][j][0] = dp[i - 1][j][0] + dp[i][j - i][0];
dp[i][j][1] = dp[i - 1][j][1] + dp[i][j - i][1];
// 高位进位
dp[i][j][0] += dp[i][j][1] / LIMIT_ULL;
// 低位限制
dp[i][j][1] = dp[i][j][1] % LIMIT_ULL;
}
}
}
if (dp[K]
[0])
{
cout << dp[K]
[0];
}
cout << dp[K]
[1] << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: