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;
}