有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。
两种方法实现:一个一维的,一个二维的
#include<stdio.h>
#define MAX 20
int a[10][20];
void OOP(int m,int n,int *w,int *p)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(w[i]<=j)
{
a[i][j]=a[i-1][j]>a[i-1][j-w[i]]+p[i] ? a[i-1][j]:a[i-1][j-w[i]]+p[i];
}else
{
a[i][j]=a[i-1][j];
}
}
}
for(int k=1;k<=n;k++)
{
for(int l=1;l<=m;l++)
{
printf("%d\t",a[k][l]);
}
printf("\n");
}
printf("最大值:%d\n",a[n][m]);
}
void main()
{
int m,n; //背包容积 物品数量
scanf("%d%d",&m,&n);
int w[MAX];
int p[MAX];
for(int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&p[i]);
}
OOP(m,n,w,p);
}
#include<stdio.h>
#include<string.h>
#define MAX 20
/*
数组是一维的
*/
void ZOP(int m,int n,int*w,int*p)
{
int f[MAX];
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
f[j]=f[j]>f[j-w[i]]+p[i]?f[j]:f[j-w[i]]+p[i];
}
for(int k=0;k<=m;k++)
{
printf("%d\t",f[k]);
}
printf("\n");
}
for(int k=0;k<=m;k++)
{
printf("%d\t",f[k]);
}
printf("\n");
}
void main()
{
int m,n; //背包容积 物品数量
scanf("%d%d",&m,&n);
int w[MAX];
int p[MAX];
for(int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&p[i]);
}
ZOP(m,n,w,p);
}