天平问题【DP】

    xiaoxiao2022-07-13  156

    >Description 现在给出n个质量的砝码,问能称出多少种质量的物品。


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

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


    >Sample Input 3 1 3 9

    >Sample Output 13


    >解题思路 因为天平的两边都可以放砝码,所以把负数看为左边放砝码,正数看为右边放砝码。 所以把最大值20000看为原点。


    >代码

    #include<iostream> #include<cstdio> using namespace std; int n,ans,a[505]; bool f[505][40005]; int main() { scanf("%d",&n); f[0][20000]=1; //0个砝码可以称0个质量 for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) for(int j=0;j<=40000;j++) if(f[i-1][j]) f[i][j+a[i]]=f[i][j-a[i]]=f[i][j]=1; for(int i=20001;i<=40000;i++) ans+=f[n][i]; //只记正数的 printf("%d",ans); return 0; }
    最新回复(0)