zoukankan      html  css  js  c++  java
  • BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )

    虽然A掉了但是时间感人啊....

    f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数.

    丢了第 i 个, 要填满容量为 k 的背包 , 则 ans( i , k ) = ∑ f( i - 1, h ) * g( i + 1 , k - h ) ( 0 <= h <= k )

    这样就转化为经典的背包问题了 f( x , k ) = f( x - 1 , k ) + f( x - 1 , k - w( x ) )

    时间复杂度是 O( nm ) , 可以过 

    ----------------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
     
    #define rep(i ,n) for(int i=0; i < n; ++i)
    #define Rep(i, n) for(int i=1; i <= n; ++i)
    #define clr(x ,c) memset(x, c, sizeof(x))
     
    using namespace std;
     
    const int maxn = 2005, MOD = 10;
     
    int n, m, w[maxn], f[maxn][maxn], g[maxn][maxn];
     
    void init() {
    cin >> n >> m;
    Rep(i, n) scanf("%d", w + i);
    clr(f, 0), clr(g, 0);
    }
     
    void work() {
    f[0][0] = g[n + 1][0] = 1;
    Rep(i, n) {
    for(int j = 0; j <= m; j++) {
    f[i][j] = f[i - 1][j];
    if(j >= w[i]) (f[i][j] += f[i - 1][j - w[i]]) %= MOD;
    }
    int h = n - i + 1;
       for(int j = 0; j <= m; j++) {
        g[h][j] = g[h + 1][j];
        if(j >= w[h]) (g[h][j] += g[h + 1][j - w[h]]) %= MOD;
       }
    }
    Rep(i, n) {
       Rep(j, m) {
        int ans = 0;
        rep(k, j + 1) (ans += f[i - 1][k] * g[i + 1][j - k]) %= MOD;
        printf("%d", ans);
       }
       putchar(' ');
    }
    }
     
    int main(){
    freopen( "test.in" , "r" , stdin );
    init();
    work();
    return 0;

      

    ----------------------------------------------------------------------------------------

    2287: 【POJ Challenge】消失之物

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 299  Solved: 166
    [Submit][Status][Discuss]

    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

    如果物品3丢失的话,只有一种方法装满容量是2的背包,即选择物品1和物品2。

    Source

  • 相关阅读:
    cinder支持nfs快照
    浏览器输入URL到返回页面的全过程
    按需制作最小的本地yum源
    创建可执行bin安装文件
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    惠普IPMI登陆不上
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)原理,架构与基本流程
    flask上下文流程图
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4656712.html
Copyright © 2011-2022 走看看