多重背包
2016-03-14 20:16
197 查看
题目大意:有N种物品和一个容量为V的背包。第i种物品最多有num[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
状态转移方程为:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]};
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 1005;
int dp
;
int c
,w
,num
;
int n,m;
void ZeroOne_Pack(int cost,int weight,int n)
{
for(int i=n; i>=cost; i--)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
void Complete_Pack(int cost,int weight,int n)
{
for(int i=cost; i<=n; i++)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
int Multi_Pack(int c[],int w[],int num[],int n,int m)
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
if(num[i]*c[i] > m)
Complete_Pack(c[i],w[i],m);
else
{
int k = 1;
while(k < num[i])
{
ZeroOne_Pack(k*c[i],k*w[i],m);
num[i] -= k;
k <<= 1;
}
ZeroOne_Pack(num[i]*c[i],num[i]*w[i],m);
}
}
return dp[m];
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
for(int i=1; i<=n; i++)
cin>>c[i]>>w[i]>>num[i];
cout<<Multi_Pack(c,w,num,n,m)<<endl;
}
return 0;
}
状态转移方程为:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]};
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 1005;
int dp
;
int c
,w
,num
;
int n,m;
void ZeroOne_Pack(int cost,int weight,int n)
{
for(int i=n; i>=cost; i--)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
void Complete_Pack(int cost,int weight,int n)
{
for(int i=cost; i<=n; i++)
dp[i] = max(dp[i],dp[i-cost] + weight);
}
int Multi_Pack(int c[],int w[],int num[],int n,int m)
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
if(num[i]*c[i] > m)
Complete_Pack(c[i],w[i],m);
else
{
int k = 1;
while(k < num[i])
{
ZeroOne_Pack(k*c[i],k*w[i],m);
num[i] -= k;
k <<= 1;
}
ZeroOne_Pack(num[i]*c[i],num[i]*w[i],m);
}
}
return dp[m];
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
for(int i=1; i<=n; i++)
cin>>c[i]>>w[i]>>num[i];
cout<<Multi_Pack(c,w,num,n,m)<<endl;
}
return 0;
}
相关文章推荐
- NSLayoutConstraint-代码实现自己主动布局的函数使用方法说明
- 学习进度条
- 内容自适应 - UILabel & UITableViewCell
- 软件hack方法(Ollydbg)
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- JAVA程序设计左边回文补全
- 完全背包
- 小学四则算式扩充
- R语言做相关性分析
- 1到20阶乘的和
- 转换流——OutputStreamWriter类与InputStreamReader类
- 命运(HDU 2571 简单动态规划)
- YTU:分数减法——结构体
- SharePoint2013 IT Professional - Create Managed Metadata Service