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

  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4656712.html
Copyright © 2011-2022 走看看