poj 1837 01背包

有个小技巧,因为力矩可能为负数,就把所有的力矩都加上一个值(加上后保证为正数就好),最后输出组成这个数的方案数

#include<stdio.h>

#include<string.h>

int pos[30],w[30];

int dp[21][4000];

int main()

{

	int C,G;

	int i,j,k;

	scanf("%d%d",&C,&G);

    for(i=1;i<=C;i++)   scanf("%d",&pos[i]);

	for(i=1;i<=G;i++)	scanf("%d",&w[i]);

    memset(dp,0,sizeof(dp));

	for(i=1;i<=C;i++)

		dp[1][1000+w[1]*pos[i]]++;

	for(i=2;i<=G;i++)

	{

		for(j=1;j<=C;j++)

		{

			for(k=1;k<=2000;k++)

			{

				if(dp[i-1][k])

					dp[i][k+w[i]*pos[j]]+=dp[i-1][k];

			}

		}

	}

	printf("%d\n",dp[G][1000]);

	return 0;

}

  

你可能感兴趣的:(poj)