HDU 2844(多重背包)

来源:互联网 发布:java 项目中使用log4j 编辑:程序博客网 时间:2024/06/06 20:27

如果没有多重背包没有那个if,也就是不考虑完全背包,全部当成01背包时间,时间会翻倍。

#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<vector>#include<algorithm>#include<iostream>#include<time.h>using namespace std;int dp[100005];int a[100005];int c[100005];int n, m;int i, j, k;void ZeroOne(int value,int weight){    for (k = m; k >=value; k--)        dp[k] = max(dp[k], dp[k -value] + weight);}void Complete(){    for (j = a[i]; j <= m; j++)        dp[j] = max(dp[j], dp[j - a[i]] + a[i]);}void Multiply(){    if (c[i] * a[i] > m)    {        Complete();    }    else    {        for (j = 1; j <= c[i]; j <<= 1)        {            c[i] -= j;            ZeroOne(j*a[i], j*a[i]);        }        ZeroOne(c[i] * a[i], c[i] * a[i]);    }}int vs_main(){    while (cin >> n >> m, n + m)    {        memset(dp, 0, sizeof(dp));        memset(a, 0, sizeof(a));        memset(c, 0, sizeof(c));        for (i = 1; i <= n; i++)        {            cin >> a[i];        }        for (i = 1; i <= n; i++)        {            cin >> c[i];        }        for (i = 1; i <= n; i++)        {                Multiply();        }        int count = 0;        for (i = 1; i <= m; i++)            if (dp[i] == i)                count++;        cout << count << endl;    }    return 0;}
0 0
原创粉丝点击