AcWing 278. 数字组合

原题链接

考察:01背包

应该是简单题,毕竟连我这种lj都写出来了233

思路:

      这道题是求方案数,不是取最值,因此我们是将模板的状态转移方程的max改成+,初始化的时候f[0][0] = 1,因为从前0个数选,和为0视为一种方法.(否则f数组一直是0)233

      注意这道题不能取模,因为和需要恰好是m,所以数组要开到和的最大值

      这道题需要优化到1维,否则会MLE(如果是本蒟蒻这种写法的话).

      但这道题是不用算>m后面的值的,因为用不到,所以第二层循环可以直接从m开始

注意: 这题数据较弱,如果强的话需要高精

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 110,M = 10010;
 6 typedef long long ll;
 7 int a[N],f[M*N-10];
 8 int main()
 9 {
10     int n,m; scanf("%d%d",&n,&m);
11     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
12     f[0] = 1;
13      for(int i=1;i<=n;i++)
14          for(int j=m*n;j>=a[i];j--)
15              f[j] = f[j]+f[j-a[i]];
16     printf("%d\n",f[m]);
17     return 0;
18 }

 

总结:

  1. 先算空间复杂度再做题= =,一般是不能太过接近临界值

      

posted @ 2021-02-01 15:53  acmloser  阅读(60)  评论(0编辑  收藏  举报