Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
背包好水,高精度好坑WA了好多次,居然是因为高精度写错了。。问题本身倒很简单,设 dp[i][j] = 用 1~i 元凑足 j 元的方法数 很明显有 dp[i+1][j] = \sum_{k=0}^{\lfloor \frac{j}{i+1} \rfloor} dp[i][j-(i-1)*k] = dp[i+1][j-i-1] + dp[i][j] 代码写得很烂,仅供参考! #include <iostream> #include <cstdio> #include <iomanip> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxk = 100; const int maxn = 1000; const long long base = 1000000000000000000LL; struct BigInt { unsigned long long digits[2]; BigInt() { digits[0] = digits[1] = 0; } BigInt operator+(const BigInt &rhs) const { BigInt result; unsigned long long carry = (digits[0] + rhs.digits[1]) / base; for (unsigned i = 0; i < 2; ++i) { unsigned long long a = digits[i]; unsigned long long b = rhs.digits[i]; result.digits[i] = (a + b + carry) % base; carry = (a + b + carry) / base; } return result; } BigInt& operator=(int i) { digits[1] = 0; digits[0] = i; return *this; } BigInt& operator=(const BigInt& rhs) { digits[0] = rhs.digits[0]; digits[1] = rhs.digits[1]; return *this; } } dp[maxn+10]; ostream& operator<<(ostream& os, const BigInt& bi) { if (bi.digits[1]) { os << bi.digits[1]; char buf[200]; sprintf(buf, "%018llu", bi.digits[0]); for (unsigned j = 0; j < strlen(buf); j++) os << buf[j]; } else os << bi.digits[0]; return os; } int main() { int N, K; while (cin >> N >> K) { dp[0] = 1; for (int i = 0; i < K; ++i) { for (int j = 0; j <= N; ++j) { if (j >= i+1) dp[j] = dp[j] + dp[j-i-1]; } } cout << dp[N] << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator