题意:第一个人有n枚硬币 第二个人有m枚硬币 两个人付的钱数差不能超过k 组成w的方案数
题解:先用dp求出两个人小于w钱数的方案 然后枚举k 求出答案 累加
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MOD = (ll)1e9+7;
ll dp1[15005],dp2[15005];
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
int n,m,w,k;
scanf("%d%d%d%d",&n,&m,&k,&w);
int sum=0;
dp1[0]=dp2[0]=1;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
sum+=x;
for(int j=sum;j>=x;j--){
dp1[j]+=dp1[j-x];
dp1[j]%=MOD;
}
}
sum=0;
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
sum+=x;
for(int j=sum;j>=x;j--){
dp2[j]+=dp2[j-x];
dp2[j]%=MOD;
}
}
ll ans=0;
for(int i=0;i<=w;i++){
int j=w-i;
if(abs(i-j)>k)continue;
ans+=dp1[i]*dp2[j]%MOD;
ans%=MOD;
}
printf("%lld\n",ans);
}
return 0;
}