1.解法一:多重背包

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX(a,b) (a>b)?a:b
const int SIZE=+;
int dp[SIZE];
int bag[];
int nLimit; void ZeroOnePack(int cost, int value)
{
for(int i=nLimit; i>=cost; i--)
dp[i]=MAX(dp[i],dp[i-cost]+value);
} void CompletePack(int cost, int value)
{
for(int i=cost; i<=nLimit; i++)
dp[i]=MAX(dp[i],dp[i-cost]+value);
} void MultiplyPack(int cost, int value, int amount)
{
if(amount*cost>=nLimit) CompletePack(cost,value);
else
{
int k=;
while(k<amount)
{
ZeroOnePack(k*cost, k*value);
amount-=k;
k<<=;
} ZeroOnePack(amount*cost,amount*value);
}
} bool CheckFinish()
{
for(int i=;i<=;i++)
if(bag[i]!=)
return false;
return true;
} int main()
{
int T=;
while(true)
{
int sum=;
for(int i=; i<=; i++)
{
scanf("%d",&bag[i]);
sum+=bag[i]*i;
}
if(CheckFinish())
break; printf("Collection #%d:\n",++T);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
memset(dp,,sizeof(dp));
nLimit=sum/;
for(int i=;i<=;i++)
{
MultiplyPack(i,i,bag[i]);
}
if(dp[nLimit]==nLimit)
printf("Can be divided.\n");
else
printf("Can't be divided.\n");
}
printf("\n"); } return ;
}

2.解法二:多重部分和

#include<cstdio>
#include<cstring>
using namespace std;
const int SIZE=+;
int a[];
int dp[SIZE];
bool check()
{
for(int i=;i<;i++)
if(a[i]!=)
return true;
return false;
}
int sum; int main()
{
int t=;
while(true)
{
sum=;
for(int i=;i<;i++)
{
scanf("%d",&a[i]);
sum+=(i+)*a[i];
}
if(!check())
break; printf("Collection #%d:\n",++t);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
memset(dp,-,sizeof(dp));
int k=sum/;
dp[]=;
for(int i=;i<;i++)
{
for(int j=;j<=k;j++)
{
if(dp[j]>=)
{
dp[j]=a[i];
}
else if(j<(i+)||dp[j-(i+)]<=)
{
dp[j]=-;
}
else
{
dp[j]=dp[j-(i+)]-;
}
}
}
if(dp[k]>=)
{
printf("Can be divided.\n");
}
else
{
printf("Can't be divided.\n");
}
}
printf("\n");
}
return ;
}

3.解法三:判断多重背包可否装满

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX(a,b) (a>b)?a:b
const int SIZE=+;
const int INF=;
int dp[SIZE];
int bag[];
int nLimit;
bool CheckFinish()
{
for(int i=;i<=;i++)
if(bag[i]!=)
return false;
return true;
} int main()
{
int T=;
while(true)
{
int sum=;
for(int i=; i<=; i++)
{
scanf("%d",&bag[i]);
sum+=bag[i]*i;
}
if(CheckFinish())
break; printf("Collection #%d:\n",++T);
if(sum%==)
{
printf("Can't be divided.\n");
}
else
{
nLimit=sum/;
memset(dp,,sizeof(dp));
dp[]=;
int dpt[];
for(int i=;i<=;i++)
{
memset(dpt,,sizeof(dpt));
for(int j=i;j<=nLimit;j++)
if(!dp[j]&&dp[j-i]&&dpt[j-i]<bag[i])
{
dpt[j]=dpt[j-i]+;
dp[j]=;
}
} if(dp[nLimit])
{
printf("Can be divided.\n");
}
else
{
printf("Can't be divided.\n");
}
} printf("\n");
} return ;
}

判断模板:

memset(dp,,sizeof(dp));
dp[]=;
int used[];
for(int i=;i<=nKind;i++)
{
memset(used,,sizeof(used));
for(int j=weight[i];j<=nLimit;j++)
if(!dp[j]&&dp[j-weight[i]]&&used[j-weight[i]]<bag[i])
{
used[j]=used[j-weight[i]]+;
dp[j]=;
}
}

HDOJ1059(多重背包)的更多相关文章

  1. 洛谷P1782 旅行商的背包[多重背包]

    题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...

  2. HDU 2082 找单词 (多重背包)

    题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...

  3. Poj 1276 Cash Machine 多重背包

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26172   Accepted: 9238 Des ...

  4. poj 1276 Cash Machine(多重背包)

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33444   Accepted: 12106 De ...

  5. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

  6. (多重背包+记录路径)Charlie's Change (poj 1787)

    http://poj.org/problem?id=1787   描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...

  7. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  8. POJ1742 Coins[多重背包可行性]

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 34814   Accepted: 11828 Descripti ...

  9. POJ1276Cash Machine[多重背包可行性]

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32971   Accepted: 11950 De ...

随机推荐

  1. jQuery-AJAX-格式

    function loadInfo(){    var domainName=$("input[name='domain-name']").val(); //域名    var c ...

  2. 我的Android进阶之旅------>Android无第三方Jar包的源代报错:The current class path entry belongs to container ...的解决方法

    今天使用第三方Jar包afinal.jar时候,想看一下源代码,无法看 然后像添加jar对应的源码包,也无法添加相应的源代码,报错如下:The current class path entry bel ...

  3. 聊聊数据库~6.SQL运维中篇

    上篇回顾:https://www.cnblogs.com/dotnetcrazy/p/10810798.html#top 1.6.5.MySQL日志相关 本文的测试环境:MySQL5.7.26.Mar ...

  4. html post

    post请求对应的html页面 页面效果 html代码 <html> <body> <form method="post" > First na ...

  5. Python OOP(3) staticmethod和classmethod统计实例

    staticmethod 统计实例 #!python2 #-*- coding:utf-8 -*- class c1: amount_instance=0 def __init__(self): c1 ...

  6. python 3 并发编程之多进程 multiprocessing模块

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  7. python 3 协程函数

    python 3 协程函数 1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器 2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yiel ...

  8. Ubuntu下,grep的用法

    grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.U ...

  9. /etc/apt/sources.list

    今天学习: 在Ubuntu下软件源的文件是/etc/apt/sources.list,那么sourdces.list.d目录下的文件又是什么作用呢? 该文件夹下的文件是第三方软件的源,可以分别存放不同 ...

  10. LINQ 学习路程 -- 查询操作 where

    1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...