您的位置:首页 > 其它

Dollar Dayz POJ - 3181 dp,完全背包,简单高精度加法

2017-02-12 15:33 423 查看
题目链接:Dollar Dayz POJ - 3181

K件物品,每件物品重量是1..K,背包重量N,求装满背包的方法数,k<=1000,n<=100

dp方程:dp[i][j] = dp[i-1][j] + dp[i][j-i];

需要用到简单的高精度加法,将一个数字拆成两部分就好了

#include<climits>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long ll;
const int MAXW = 1000+10;
const ll N = 1000000000000000000;
int n, W;
ll dp[MAXW][2];

int main()
{
scanf("%d%d", &W, &n);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i=1; i<=n; i++)
{
for(int j=i; j<=W; ++j)
{
dp[j][0] += dp[j-i][0];
dp[j][1] += dp[j][0]/N + dp[j-i][1];
dp[j][0] %= N;
}
}
if(dp[W][1]) cout << dp[W][1];
cout << dp[W][0] << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: