#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;
}