zoukankan      html  css  js  c++  java
  • 2287: 【POJ Challenge】消失之物

    Description

    ftiasch 有 N 个物品, 体积分别是 W1W2, ..., WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” -- 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。

    Input

    第1行:两个整数 N (1 ≤ N ≤ 2 × 103) 和 M (1 ≤ M ≤ 2 × 103),物品的数量和最大的容积。

    第2行: N 个整数 W1W2, ..., WN, 物品的体积。

    Output

    一个 N × M 的矩阵, Count(i, x)的末位数字。

    Sample Input

    3 2
    1 1 2

    Sample Output

    11
    11
    21

    HINT

     解析:首先我们先不要考虑是否会有一个物品消失,直接先用f数组来表示到第i个物品时,能达到j的重量的方案有多少,然后用一个c数组来表示所有物品中,除去第i个物品,能达到j的重量的方案有多少,c[i][j]=f[n][j]-c[i][j-a[i]](c[i][j-a[i]]指除去第i个物品中能达到j-a[i]重量的方案数即其他物品加上a[i](即算上第i个物品)后能达到j的重量的方案数,减去后,剩下的就是,不用第i个物品达到j的方案数);(a[i]表示当前物品的重量)具体步骤看程序。

    ps:因为题目要求输出个位数,所以过程中必须取余10,但是在后面个位数减去个位数会造成负数的情况,所以在一些地方需要+10后再运算。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long f[2005][2005],w[3000],b[2005][2005],x,n,m;
    int main()
    {
      cin>>n>>m;
      for (int i=1;i<=n;i++) cin>>w[i];
      for (int i=0;i<=n;i++)
      for (int j=0;j<=m;j++)
      f[i][j]=0,b[i][j];
      f[0][0]=1;//刚开始前0个物品达到0的重量的方案数为一
      for (int i=1;i<=n;i++)
       for (int j=0;j<=m;j++)
       if (j-w[i]>=0) f[i][j]+=(f[i-1][j-w[i]]+f[i-1][j])%10;//取或不取的方案数都加上
       else f[i][j]+=f[i-1][j]%10;
       
      for (int i=1;i<=n;i++)
       for (int j=0;j<=m;j++)
       if (j-w[i]>=0) b[i][j]=(f[n][j]-b[i][j-w[i]]+10)%10;//不取第i个物品的达到j的重量的方案数由此得出,加10是为了避免个位与个位相减时出现负数。
       else b[i][j]=f[n][j]%10;
       
      for (int i=1;i<=n;i++)
       for (int j=1;j<=m;j++)
       if (j!=m) cout<<b[i][j];
       else cout<<b[i][j]<<endl;//输出
      return 0;
    }

    好啦

  • 相关阅读:
    Druid 配置_DruidDataSource参考配置
    Druid 配置 wallfilter
    Druid 配置_配置WebStatFilter
    Druid 配置_StatViewServlet配置
    Druid 配置_StatFilter
    Druid数据库连接池使用
    Spring泛型依赖注入
    java计算代码执行时间
    模板方法在Spring事务中的应用
    maven,阿里云国内镜像,提高jar包下载速度
  • 原文地址:https://www.cnblogs.com/2014nhc/p/6221332.html
Copyright © 2011-2022 走看看