单种物品数量不一定为1的背包问题
来源:互联网 发布:linux运维发展方向 编辑:程序博客网 时间:2024/04/29 19:35
#include<iostream>
using namespace std;
void knapsack(int *v,int *w,int c,int n,int *x)
{
int i,j,k,Item_sum=0;
int **m; //m为新的二维数组
for(i=1;i<=n;i++)
Item_sum+=x[i];
m=new int*[Item_sum+1];
for(i=0;i<=Item_sum;i++)
m[i]=new int[c+1];
int *w1=new int[Item_sum+1];//扩充w
int *v1=new int[Item_sum+1];//扩充v
for(i=1,k=1;i<=n;i++)
for(j=1;j<=x[i];j++,k++)
{
w1[k]=w[i];
v1[k]=v[i];
} //给w1,v1赋值
n=Item_sum;
//以下为与0-1背包几乎完全相同的操作
int jMax=min(w1[n]-1,c);
for (int j=0;j<=jMax;j++) m[n][j]=0;
for (int j=w1[n];j<=c;j++) m[n][j]=v1[n];
for (int i=n-1; i>1; i--)
{ jMax=min(w1[i]-1, c);
for (int j=0; j<=jMax; j++)
m[i][j]=m[i+1][j];
for (int j=w1[i]; j<=c; j++)
m[i][j]=max(m[i+1][j], m[i+1][j-w1[i]]+v1[i]);
}
m[1][c]=m[2][c];
if (c>=w1[1]) m[1][c]=max(m[2][c], m[2][c-w1[1]]+v1[1]);
cout<<m[1][c];
}
int main()
{
int v[]={0,5,2,8},w[]={0,3,1,2},x[]={1,1,2,1};//物品数量为3,有效元素只有后面3个,v[0],w[0],x[0]无用
int c=6,n=3,i,j,k;
knapsack(v,w,c,n,x);
system("PAUSE");
return 1;
}
using namespace std;
void knapsack(int *v,int *w,int c,int n,int *x)
{
int i,j,k,Item_sum=0;
int **m; //m为新的二维数组
for(i=1;i<=n;i++)
Item_sum+=x[i];
m=new int*[Item_sum+1];
for(i=0;i<=Item_sum;i++)
m[i]=new int[c+1];
int *w1=new int[Item_sum+1];//扩充w
int *v1=new int[Item_sum+1];//扩充v
for(i=1,k=1;i<=n;i++)
for(j=1;j<=x[i];j++,k++)
{
w1[k]=w[i];
v1[k]=v[i];
} //给w1,v1赋值
n=Item_sum;
//以下为与0-1背包几乎完全相同的操作
int jMax=min(w1[n]-1,c);
for (int j=0;j<=jMax;j++) m[n][j]=0;
for (int j=w1[n];j<=c;j++) m[n][j]=v1[n];
for (int i=n-1; i>1; i--)
{ jMax=min(w1[i]-1, c);
for (int j=0; j<=jMax; j++)
m[i][j]=m[i+1][j];
for (int j=w1[i]; j<=c; j++)
m[i][j]=max(m[i+1][j], m[i+1][j-w1[i]]+v1[i]);
}
m[1][c]=m[2][c];
if (c>=w1[1]) m[1][c]=max(m[2][c], m[2][c-w1[1]]+v1[1]);
cout<<m[1][c];
}
int main()
{
int v[]={0,5,2,8},w[]={0,3,1,2},x[]={1,1,2,1};//物品数量为3,有效元素只有后面3个,v[0],w[0],x[0]无用
int c=6,n=3,i,j,k;
knapsack(v,w,c,n,x);
system("PAUSE");
return 1;
}
0 0
- 单种物品数量不一定为1的背包问题
- 有物品数量限制的背包问题
- 泛化物品的背包问题
- 物品无限的背包问题
- P08泛化物品的背包问题
- hiho1043(无限物品的背包问题)
- 0-1背包问题输出物品编号
- 背包问题-泛化物品
- 两种类型的背包问题模板(无限物品和0-1背包问题)
- C/C++中整型数组的下标类型不一定为整型
- c++ class对象默认不一定为NULL
- 可拆分物品背包问题
- 物品无限的背包问题(贪心算法) By ACReaper
- 动态规划——物品无限的背包问题
- 完全背包问题 打印背包中的物品
- 0-1背包问题(回溯物品类)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- 背包问题——“完全背包”详解及实现(包含背包具体物品的求解)
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
- 2014求职记(三)
- 日本超过8万台计算机感染网银病毒!
- java static关键字
- 03-树1. List Leaves 经验
- 单种物品数量不一定为1的背包问题
- 关于android 中WebView使用Css
- Step into Scala - 05 - 块与函数
- RoseHA8.9 技术白皮书
- android soap协议 Java soap协议
- Structs2 HelloWorld-06 异常处理
- 重磅发布:史上首份揭秘微信公众号用户行为习惯研究报告
- 迷宫问题
- C++ typedef使用总结