zoukankan      html  css  js  c++  java
  • P1566 加等式

    P1566 加等式

    题目描述

    对于一个整数集合,我们定义“加等式”如下:集合中的某一个元素可以表示成集合内其他元素之和。如集合{1,2,3}中就有一个加等式:3=1+2,而且3=1+2 和3=2+1是相同的加等式,也是这个集合唯一的加等式。给定一个整数集合,编程找出其所有的加等式的个数

    输入输出格式

    输入格式:

    第一行为t,表示测试数据组数。(1≤t≤10);

    接下来t 行,每行表示一组测试数据。其中第一个数m(1≤m≤30),表示集合元素的个数,接下来m 个不同的整数x 分别表示集合元素(1≤m≤1000)。

    输出格式:

    对于每个输入数据,输出一个整数,表示其中加等式的个数。

    输入输出样例

    输入样例#1: 复制
    3
    3 1 2 3
    3 1 2 5
    6 1 2 3 5 4 6
    输出样例#1: 复制
    1
    0
    7

    洛谷题解:

    使用01背包,求出方案总数。

    f[c]=Σfc-w[i]

    初始f[0]=1,其他f[i]=0

    时间复杂度O(tm*max{x})

    这道题是一道变形的01背包方法数问题。我们可以先求出每个数拆成其他数之和的方案总数,最后再相加。求每个数拆成其他数之和的状态转移方程是f[j]=sum(f[j],f[j-i]); 1<=i<=n a[i]<=j<=m(其中,m是所有数的最大的数)边界应是f[0]=1,最后把解算出来一定要减n!!!(因为还要去掉每个数自身的方案)

    方便理解,我直接用程序打表就好,没必要空想。

     

     每次都是用最后一样物品在试。

    题目没看清,没说一定是两个数的和。

    肯定会导致题目看不清。 

     1 #include <bits/stdc++.h>//万能头文件 
     2 using namespace std;
     3 int a[100000],f[100000];//数组a是存放读入的数,数组f存放的每个数的拆成其他数或自己之和的方案总数
     4 int main()
     5 {
     6     int t;
     7     cin>>t;
     8     while(t--)//读入t组数据 
     9     {
    10         int m=-1,ans=0,n;
    11         memset(f,0,sizeof(f));//别忘了初始化 
    12         cin>>n;
    13         for(int i=1; i<=n; i++)
    14         {
    15             cin>>a[i];
    16             m=max(m,a[i]);//m存放最大数 
    17         }
    18         f[0]=1;//边界 
    19         for(int i=1; i<=n; i++)
    20         {
    21             for(int j=m; j>=a[i]; j--)//是从m递减到a[i],不要写反了,不然就是完全背包的方案数了。 
    22             f[j]+=f[j-a[i]];//套用状态转移方程 
    23         }
    24         for(int j=1; j<=n; j++)
    25         {
    26             ans+=f[a[j]];//累加每个数的拆成其他数或自己之和的方案数
    27         }
    28         cout<<ans-n<<endl;//还要减掉每个数自身的方案
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7727490.html
Copyright © 2011-2022 走看看