HDOJ1059(多重背包)
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(多重背包)的更多相关文章
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
- Poj 1276 Cash Machine 多重背包
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26172 Accepted: 9238 Des ...
- poj 1276 Cash Machine(多重背包)
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33444 Accepted: 12106 De ...
- (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
- (多重背包+记录路径)Charlie's Change (poj 1787)
http://poj.org/problem?id=1787 描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- POJ1742 Coins[多重背包可行性]
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
- POJ1276Cash Machine[多重背包可行性]
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32971 Accepted: 11950 De ...
随机推荐
- Modeling of Indoor Positioning Systems Based on Location Fingerprinting
Kamol Kaemarungsi and Prashant Krishnamurthy Telecommunications Program School of Information Scienc ...
- Bootstrap第2天
Bootstrap第2天 解决IE低版本不支持HTML5元素的方法 CSS全局样式--栅格系统 1.栅格系统介绍 Bootstrap提供了一套响应式.移动设备优先的流式的栅格系统. B ...
- go语言之并发编程 channel(1)
单向channel: 单向通道可分为发送通道和接收通道.但是无论哪一种单向通道,都不应该出现在变量的声明中,假如初始化了这样一个变量 var uselessChan chan <- int =m ...
- date_default_timezone_get():
[Symfony\Component\Debug\Exception\ContextErrorException] Warning: date_default ...
- Linux改动hostname的两个办法
假设你想把主机名改为 linux的话.两中方法: 1. # hostname linux 这样改动了以后马上生效.可是重新启动后就没了 2. # vi /etc/sysconfig/network 改 ...
- proguard 不混淆第三方jar包的问题
导入lib文件,并且用-dontwarn 和 keep class结合试试,例如: -libraryjars libs/log4j.jar -dontwarn org.apache.log4j.*-k ...
- 解决IntelliJ IDEA无法读取配置文件的问题(转发:https://www.cnblogs.com/Sinte-Beuve/p/5730572.html)
最近在学Mybatis,按照视频的讲解在项目的某个包里建立配置文件,然后读取配置文件,但是一直提示异常. 读取配置文件的为官方代码: String resource = "mybatis-c ...
- sublime 添加 颜色插件 colorcoder
高亮所有变量,因此可以极大的简化代码定位.尤其是对那些有阅读障碍的程序员非常有帮助.
- Django——auth用户认证
之前我们在进行用户校验的时候,总是从数据库中获取数据,然后再进行对比,就像如下这样: def login(request): if request.method == "POST" ...
- Git——基本操作(三)
一.安装和配置 1.Git安装 yum install git -y 安装完Git就可以对其做一些配置: Git有一个工具被称为git config,它允许你获得和设置配置变量: 这些变量可以控制Gi ...