#include <iostream>
#include <algorithm>
#define Index 1000000000000000000
using namespace std;
const int inf=1<<20;
const int M =1100;
unsigned long long p[M],dp[M][2]; // dp[i][j] 前i种物品装入体积j的背包 装满的方法数
//dp[M][0],dp[M][1] dp[M]的高位和地位
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=k;i++)
{
p[i]=i;// 每个体积
}
for(int j=1;j<=n;j++)
{
dp[j][0]=0;
dp[j][1]=0; // 前0种装不满
}
dp[0][1]=1;
for(int i=1;i<=k;i++)
{
for(int j=p[i];j<=n;j++) // 物品无限-> 完全背包
{
if(dp[j-p[i]][0]>=0) // 加上至少选一件的方法数
{
dp[j][0]+=dp[j-p[i]][0];
}
if(dp[j-p[i]][1]>=0)
{
dp[j][1]+=dp[j-p[i]][1];
}
dp[j][0]+=dp[j][1]/Index; // 进位
dp[j][1]%=Index;
}
}
if(dp[n][0]>0) // 高位存在
cout<<dp[n][0];
cout<<dp[n][1]<<endl;
return 0;
}
poj 3181 完全背包计数+高精度
最新推荐文章于 2024-04-18 23:25:48 发布