问题:
分析:
依然是背包问题的变形。
如每个色子不同,可以直接:
A【i】【j】标识第i个及其之后的筛子 和为i的总数和。
但是筛子相同,可以考虑增加1维,表示只能放其之后的数字。那不如用搜索。
(1,2)和(2,1)不同:
#include<bits/stdc++.h>
using namespace std;
int A[1001][1001];
int ff(int d, int f, int target)
{
cout<<target<<" "<<d<<endl;
if(A[target][d]!=-1) return A[target][d];
if(d>target)
{
return 0;
}
if(d==0&&target==0) return 1;
if(d==0&&target!=0) return 0;
A[target][d]=0;
for(int i=1;i<=f;i++)
{
if(target-i>=0)
A[target][d]=(A[target][d]+ff(d-1,f,target-i))%(int)(pow(10,9)+7);
else break;
}
return A[target][d];
}
int main()
{
int d=2;
int f=5;
int target=10;
for(int i=0;i<1001;i++)
for(int ii=0;ii<1001;ii++)
A[i][ii]=-1;
cout<<ff(d,f,target);
}
(1,2)和(2,1)相同:
int A[1001][1001][31];
int all=0;
void f1(int d, int f, int target)
{//f代表可以放小于等于几的数
if(target==0&&d==0)
{
all++;
return ;
}
if(target<d) return;
if(f==1)
{
if(d==target) all++;
return;
}
//f(d,f-1,target);//放0个的情况
for(int i=0;;i++)
{
if(target-i*f>=0)
f1(d-i,f-1,target-i*f);
else break;
}
}
int main()
{
int d;//个数
int f;//面数
int target;//目标数
f(d,f,target);
return all;
}