现在的位置: 首页 > 综合 > 正文

【POJ1837】Balance,带负体积状态的01背包,水题

2016年09月22日 ⁄ 综合 ⁄ 共 669字 ⁄ 字号 评论关闭

天平上有若干钩子,你在上面放砝码使它平衡,求有多少种方法。

状态怎么转移,状态是什么不赘述了,只是记得把状态往后推推,别因为负状态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;
}

抱歉!评论已关闭.