单种物品数量不一定为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;
}
0 0
原创粉丝点击