天平上有若干钩子,你在上面放砝码使它平衡,求有多少种方法。
状态怎么转移,状态是什么不赘述了,只是记得把状态往后推推,别因为负状态RE就好了。
比如需要用到f[-2],f[-1],f[0],f[1],f[2],那么就把他们变成f[1~5],然后用的时候f[i]写成f[3+i]就好了!
贴代码,不懂自己看!
#include <cstdio> #include <cstring> #include <algorithm> #define N 25 #define M 6000 #define inf 0x3f3f3f3f using namespace std; int n,m; int a[N],b[N],f[N][M<<1]; int A1,A2,A,B; int main() { // freopen("test.in","r",stdin); int i,j,k; scanf("%d%d",&n,&m); A1=inf;A2=-inf;B=0; for(i=1;i<=n;i++)scanf("%d",&a[i]),A1=min(A1,a[i]),A2=max(A2,a[i]); for(i=1;i<=m;i++)scanf("%d",&b[i]),B+=b[i]; A=max(-A1,A2); A*=B; f[0][M]=1; for(i=1;i<=m;i++)for(j=1;j<=n;j++) { for(k=M-A;k<=M+A;k++) { f[i][k]+=f[i-1][k-a[j]*b[i]]; } } printf("%d\n",f[m][M]); return 0; }