天平问题【DP】

Description–

小C为了试验小X,便为物竞的小X出了一道物理相关的题:现在给出n个质量的砝码,问小X能称出多少种质量的物品,可是总有好事者想要破坏,于是乎,n达到了500,远远超出了小X能够承受的范围,锲而不舍的他决定寻求你们的帮助。


Input–

第一行输入一个的正整数N
以下N行每行一个不超过200的正整数,依次表示每个砝码的质量。

Output–

输出总共能称出多少种不同质量的物品。


Sample Input–

3
1
3
9

Sample Output–

13


说明–

注意:天平有两边,两边均可放。


代码–

#include<iostream>
#include<cstdio>
using namespace std;
bool f[505][40005];
int n,a,ans;
int main()
{
	scanf("%d",&n);
	f[0][20000]=1; //初始化:0个砝码可以称0kg的物品
	for (int i=1;i<=n;++i)
	{
	    scanf("%d",&a);
	    for (int j=0;j<=40000;++j)
	      if (f[i-1][j])
	        {
			    f[i][j]=1;
	        	if (j+a<40000) f[i][j+a]=1;
	    		if (j-a>=0) f[i][j-a]=1;
	        }
	}
	for (int i=20001;i<=40000;++i)
	  if (f[n][i])
	    ans++;
	printf("%d",ans);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43654542/article/details/90725541