HDU 2844 多重背包模板

给出n个数和m

每个数给出出现次数和价值,问任意组合组成不大于M的价值,共能产生多少个数

多重背包的的二进制优化写法  模板mark一下

二进制优化原理:

1、2、4可以组合出所有小于8的数;

1、2、4、8可以组合出所有小于16的数;

1、2、4、8、16可以组合出所有小于32的数;

……

#include "stdio.h"
#include "string.h"

int n,m;
int dp[100010];
void complete_pack(int v)
{
    int i;
    for (i=v;i<=m;i++)
        if (dp[i-v]==1) dp[i]=1;
}

void onezero_pack(int v)
{
    int i;
    for (i=m;i>=v;i--)
        if (dp[i-v]==1) dp[i]=1;
}

void multiple_pack(int v,int c)
{
    int k;
    if (v*c>=m)
        complete_pack(v);
    else
    {
        k=1;
        while (k<c)
        {
            onezero_pack(k*v);
            c-=k;
            k*=2;
        }
        onezero_pack(c*v);
    }
}
int main()
{
    int v[101],c[101];
    int i,ans;
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        if (n+m==0) break;
        for (i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for (i=1;i<=n;i++)
            scanf("%d",&c[i]);

        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for (i=1;i<=n;i++)
            multiple_pack(v[i],c[i]);
        ans=0;
        for (i=1;i<=m;i++)
            if (dp[i]!=0) ans++;
        printf("%d\n",ans);
    }
    return 0;

}
时间: 2024-10-10 04:39:57

HDU 2844 多重背包模板的相关文章

Coins(hdu 2844 多重背包)

Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10632    Accepted Submission(s): 4230 Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One

hdu 2844 多重背包coins

http://acm.hdu.edu.cn/showproblem.php?pid=2844 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8909    Accepted Submission(s): 3580

hdu 1171 Big Event in HDU(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=1171 题意:有n种物品,给出每种物品的价值和数目,要将这些物品尽可能的分成相等的两份A和B且A>=B ,输出A,B. 母函数可以过,但感觉最直接的方法应该是多重背包. 母函数的话,也是按总价值的一半求,从一半到小枚举,直到找到系数不为0的就是B. #include <stdio.h> #include <iostream> #include <map> #include <

HDU 1059 多重背包+二进制优化

Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16909    Accepted Submission(s): 4729 Problem Description Marsha and Bill own a collection of marbles. They want to split the collection

hdu 5445 多重背包

Food Problem Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1243    Accepted Submission(s): 368 Problem Description Few days before a game of orienteering, Bell came to a mathematician to sol

多重背包模板

/** * 多重背包: * 有N种物品和一个容量为V的背包.第i种物品最多有Mi件可用, * 每件耗费的空间是Ci,价值是Wi. * 求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大. */ #include <stdio.h> #include <string.h> int max(int a, int b){ if (a > b)return a; return b; } #define maxn 100005 int c[maxn], w

hdu 2191 多重背包,自己写模板

背景:wa了几次,都是小失误:把i--写成i++之类的,写的时候一定要想到具体用意.还有就是一定要至少写三组测试数据!!!!!!! 学习:模板化写多重背包. #include<cstdio> #include<iostream> #include<cstring> using namespace std; int t,v,n; int c[109],w[109],num[109],F[109]; void zeroonebag(int cost,int weight){

Big Event in HDU(多重背包套用模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28483    Accepted Submission(s): 10027 Problem Description Nowadays, we all know

hdu 2844 混合背包【背包dp】

http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张.问这些钱能拼成1-m中多少种值. 题解:背包dp问题.若ci=1,是01背包,若ci*ai>=m则是完全背包,否则是多重背包.(详见<背包九讲>) 先复习一下三种简单背包形式: 01背包(F[v] ← max{F[v], F[v ?Ci] +Wi} ): 完全背包(F[i, v] = max(F[i ?