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. UITableview刷新时界面“乱跑”现象

    Self-Sizing在iOS11下是默认开启的,Headers, footers, and cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变 ...

  2. ElasticSearch(二十)定位不合法的搜索及其原因

    GET /test_index/test_type/_validate/query?explain { "query": { "math": { "t ...

  3. Adam 算法

    简介 Adam 是一种可以替代传统随机梯度下降(SGD)过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重.Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学 ...

  4. 未启用对服务器的远程访问 win7

    设置好远程桌面,但是输入IP后却说未启用服务器远程访问 家里有2台机.另外一台经设置后可以使用远程桌面控制主机的程序了.但是主机在运行远程桌面访问另一台机时却说由于一些原因之一无法连接到远程计算机:1 ...

  5. 326 集合 ,数据类型的补充 ,copy , 编码之间的转换

    一.数据类型补充1,对于元组:如果只有一个元素,并且没有逗号,此元素是什么数据类型,改表达式就是什么数据类型. tu = () tu1 = (,) print(tu,type(tu)) #1 < ...

  6. ll指令输出解析

    从左到右: 文件属性 共有10-11位,分别表示: 1.表示目标属性,d目录,l连结文件,-文件 2-4,owner权限,顺序为: r可读.w可写.x可执行,例如: rwx可读写执行,rw-可读写不能 ...

  7. Logstash添加Protobuf解析插件

    logstash收集日志时,日志部分是由google的protobuf工具打印的,直接利用json解析会造成部分无法解析的问题 搜索后发现有个logstash的protobuf插件 在logstash ...

  8. Codeforces 461B Appleman and Tree:Tree dp

    题目链接:http://codeforces.com/problemset/problem/461/B 题意: 给你一棵树(编号从0到n-1,0为根节点),每个节点有黑白两种颜色,其中黑色节点有k+1 ...

  9. 英语发音规则---字母组合oo的发音规律

    英语发音规则---字母组合oo的发音规律 一.总结 一句话总结:在英语单词中,字母组合oo多数读长音/u:/,少数读短音/ʊ/.另外,还有极少数的特殊情况读/ʌ/, 在英语单词中,字母组合oo多数读长 ...

  10. R语言编程中的常见错误

    R语言编程中的常见错误有一些错误是R的初学者和经验丰富的R程序员都可能常犯的.如果程序出错了,请检查以下几方面. 使用了错误的大小写.help().Help()和HELP()是三个不同的函数(只有第 ...