zoukankan      html  css  js  c++  java
  • [cf360 div1.C]The Values You Can Make[Dp]

    题意:有n个硬币,面值不同,求能组成K的方案中,每个方案的硬币可以凑成那些答案。

      例如, K=5 面值={1,1,1,2,3}

      K={1,1,1,2} K={1,1,3} K={2,3} 那么答案是 {1,1,1,2}能组成的面值∪{1,1,3}组成的面值∪{2,3}组成的面值。

    做法:

    考虑如果A在答案中,那么K-A一定也在答案中。

    也就是说,如果A和K-A可以用不相交的硬币子集构成,那么他们都在答案中。

    用dp[i][j]表示i和j是否可以同时出现在答案中。

    因为每个硬币只能用一次,dp[i+x][j]=dp[i][j+x]=1

    可以$n^3$爆枚,也可以用bitset优化,最终统计$sum dp[i][k-i]$

    #include<cstdio>
    int i,j,dp[1555][1555],n,k,K;
    int main(){
      dp[0][0]=1;
      scanf("%d%d",&n,&K);
      for(int kk=0;kk<n;kk++){
        int x;
        scanf("%d",&x);
        for(i=500;i>=0;i--)
          for(j=500;j>=0;j--)
            if(dp[i][j])dp[i+x][j]=dp[i][j+x]=1;
      }
      for(i=0;i<=K;i++)
        k+=dp[i][K-i];
      printf("%d
    ",k);
      for(i=0;i<=K;i++)
        if(dp[i][K-i])printf("%d ",i);
    }

    The Values You Can Make

  • 相关阅读:
    python 类函数
    scala 排序
    php基础-面向对象
    PHP基础-常用的数组相关处理函数
    PHP基础-PHP中预定义的超全局数组
    PHP基础-数组
    装饰器
    Python3.x 文件操作练习
    Python3.x 文件操作
    Python3 内置函数
  • 原文地址:https://www.cnblogs.com/Gster/p/5629640.html
Copyright © 2011-2022 走看看