题目链接:http://poj.org/problem?id=1014

背包问题太经典了,之前的一篇博客已经讲了背包问题的原理。

这一个题目是多重背包,但是之前的枚举是超时的,这里采用二进制优化。

这是所有01背包,完全背包,多重背包的模板哦!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int sum;
int num[], dp[ + ]; void ZeroOnePack(int cost, int weight, int V)
{
for (int i = V; i >= cost; i--)
{
dp[i] = max(dp[i], dp[i - cost] + weight);
}
} void CompletePack(int cost, int weight, int V)
{
for (int i = cost; i <= V; i++)
{
dp[i] = max(dp[i], dp[i - cost] + weight);
}
} void MultiPack(int cost, int weight, int V, int amount)
{
if (cost * amount >= V)
{
CompletePack(cost, weight, V);
return;
}
int k = ;
while (k < amount)
{
ZeroOnePack(cost * k, weight * k, V);
amount -= k;
k *=;
}
ZeroOnePack(cost * amount, weight * amount, V);
} int main()
{
int t = ;
while (~scanf("%d", &num[]))
{
sum = num[];
for (int i = ; i <= ; i++)
{
scanf("%d", &num[i]);
sum += num[i] * i;
}
if (num[] + num[] + num[] + num[] + num[] + num[] == ) break;
printf("Collection #%d:\n", t++);
if (sum % )
{
puts("Can't be divided.\n");
continue;
}
sum >>= ;
memset(dp, , sizeof(dp));
for (int i = ; i <= ; i++)
{
MultiPack(i, i, sum, num[i]);
}
if (dp[sum] != sum)
{
puts("Can't be divided.\n");
}
else
puts("Can be divided.\n");
}
return ;
}

背包问题模板,POJ(1014)的更多相关文章

  1. 证明 poj 1014 模优化修剪,部分递归 有错误

    这个问题是存在做.我发现即使是可行的一个问题,但不一定正确. 大部分数据疲软,因为主题. id=1014">poj 1014 Dividing 题目大意:有6堆石头,权重分别为1 2 ...

  2. POJ-动态规划-背包问题模板

    背包问题模板 一.0-1背包 状态:背包容量为j时,求前i个物品所能达到最大价值,设为dp[i][j].初始时,dp[0][j](0<=j<=V)为0,没有物品也就没有价值. 状态转移方程 ...

  3. 【多重背包模板】poj 1014

    #include <iostream> #include <stdio.h> #include <cstring> #define INF 100000000 us ...

  4. DFS(DP)---POJ 1014(Dividing)

    原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...

  5. POJ 1014 Dividing(多重背包+二进制优化)

    http://poj.org/problem?id=1014 题意:6个物品,每个物品都有其价值和数量,判断是否能价值平分. 思路: 多重背包.利用二进制来转化成0-1背包求解. #include&l ...

  6. K短路模板POJ 2449 Remmarguts' Date

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:32863   Accepted: 8953 Description &qu ...

  7. POJ 1014 Dividing(多重背包)

    Dividing   Description Marsha and Bill own a collection of marbles. They want to split the collectio ...

  8. Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)

    多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...

  9. 最小费用最大流模板 poj 2159 模板水题

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15944   Accepted: 8167 Descr ...

随机推荐

  1. php数组·的方法3-数组和变量之间的转换

    /* * 数组和变量之间的转换 * */ //extract() 使用数组定义一组变量 // 键名为变量名 键值为变量值(类似于js的解构赋值) // 返回值是数组的长度 echo '<hr&g ...

  2. CSP-201604-2-俄罗斯方块

    试题编号: 201604-2 试题名称: 俄罗斯方块 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个1 ...

  3. Nginx 为什么要延迟关闭

    防止 Nginx处理完后调用close关闭连接后  ,若缓冲区任然接收到客户端发来的内容 ,则服务器会向客户端发送RST包关闭连接,导致客户端由于收到了RST而忽略了  http  response  ...

  4. c++ 封装线程库 3

    1. 继承与重写run方法 我们封装了Thread类,并设置成员函数run()为纯虚函数,因此我们使用类继承,并重写run方法: class IncCount : public Thread//增加计 ...

  5. 可输入的 Combox(DropDownList)

    aspx页面中需要可以输入的combox,在网上找了一个js的插件,效果图如下:

  6. Nginx的验证、启动、停止、重启

    验证 验证nginx配置文件是否正确,进入sbin目录,输入以下命令: ./nginx -t  启动 进入sbin目录,输入以下命令: ./nginx -c /home/mppay/nginx/con ...

  7. (转)cut命令详解

    Linux:cut命令详解   cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 说明 该命令有两项功能,其一是用来显示文件的内容,它依次读取由参 ...

  8. java 日志框架的选择Log4j->SLF4j->Logback

    Log4j->SLF4j->Logback是同一个人开发的 import lombok.extern.slf4j.Slf4j; import org.junit.Test; import ...

  9. js分享插件

    这是个在线版的分享插件 <div class="share-icon"> <span>分享:</span> <div class=&quo ...

  10. Hibernate多对多删除问题的解决

    原出处:http://superleo.iteye.com/blog/154587 Hibernate多对多的例子不少,但仔细一看,大多数都是保存的,删除谈的少,但问题还不少,因此有必须简单测试一下, ...