我在某个比赛中遇到了这个问题,但还没有想出解决方案。
这个男孩有苹果并放在盒子里。一个盒子里最多不超过N/2个苹果。他可以将糖果放在盒子里的方法有多少种。
所以我想尝试使用DP实现解决方案。以下是我的代码:
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <unistd.h>
#include <vector>
#define size 1002
using namespace std;
long long a[size][size];
int n, k;
int main()
{
cin >> n >> k;
int kk = n/2;
for(int i = 0; i <= k; ++i)
a[0][i] = 1;
a[0][0] = 0;
for(int i = 0; i <= kk; ++i)
a[i][1] = 1;
for(int i = 1; i <= n; ++i) {
for(int j = 2; j <= k; ++j) {
int index = 0;
long long res = 0;
while(1) {
res += a[i-index][j - 1];
index += 1;
if(index == kk + 1 || i-index < 0)
break;
}
a[i][j] = res;
}
}
cout << a[n][k] << endl;
}
但问题在于我们的输入中有大量的数字,例如:
因此,对于像 N = 1000 和 S = 1000 这样的输入,我需要花费 5*10^8 次操作。而且这些数字非常大,所以我必须使用 BigInteger 算法?2 ≤ N ≤ 1000 是糖果的数量,N - 偶数; 2 ≤ S ≤ 1000 - 是小盒子的数量。
也许有一种算法可以在线性时间内实现该问题?谢谢,对我的英语不好感到抱歉!