完全背包是在N种物品中选取若干件(同一种物品可多次选取)放在空间为V的背包里,每种物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解怎么装物品可使背包里物品总价值最大。
总结了一下,写出了几种方法,和大家交流学习
#include<stdio.h>
#include<string.h>
#define MAX 20
#define MAXM 20
#define MAXN 10
/*
背包问题
基本思路 二维
*/
void CP(int m,int n,int*w,int*p)
{
int temp;
int f[MAXN][MAXM];
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=0;k<=j/w[i];k++)
{
temp=f[i-1][j]>f[i-1][j-k*w[i]]+k*p[i]?f[i-1][j]:f[i-1][j-k*w[i]]+k*p[i];
if(temp>f[i][j])
{
f[i][j]=temp;
}
}
}
}
for(int x=1;x<=n;x++)
{
for(int y=1;y<=m;y++)
{
printf("%d\t",f[x][y]);
}
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]);
}
CP(m,n,w,p);
}
#include<stdio.h>
#include<string.h>
#define MAX 20
#define MAXM 20
#define MAXN 10
/*
背包问题
基本思路 二维
*/
void CP(int m,int n,int*w,int*p)
{
int f[MAXN][MAXM];
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j<w[i])
{
f[i][j]=f[i-1][j];
}else
{
f[i][j]=f[i-1][j]>f[i][j-w[i]]+p[i]?f[i-1][j]:f[i][j-w[i]]+p[i];
}
}
}
for(int x=1;x<=n;x++)
{
for(int y=1;y<=m;y++)
{
printf("%d\t",f[x][y]);
}
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]);
}
CP(m,n,w,p);
}
#include<stdio.h>
#include<string.h>
#define MAX 20
#define MAXM 20
/*
背包问题
基本思路 一维数组
*/
void CP(int m,int n,int*w,int*p)
{
int f[MAXM];
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j>=w[i])
{
if(f[j-w[i]]+p[i]>f[j])
{
f[j]=f[j-w[i]]+p[i];
}
}
}
for(int x=1;x<=m;x++)
{
printf("%d\t",f[x]);
}
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]);
}
CP(m,n,w,p);
}
#include<stdio.h>
#include<string.h>
#define MAX 20
#define MAXM 20
/*
背包问题
基本思路 一维数组
*/
void CP(int m,int n,int*w,int*p)
{
int f[MAXM];
memset(f,0,sizeof(f));
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
{
if(j>=w[i])
{
if(f[j-w[i]]+p[i]>f[j])
{
f[j]=f[j-w[i]]+p[i];
}
}
}
for(int x=1;x<=m;x++)
{
printf("%d\t",f[x]);
}
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]);
}
CP(m,n,w,p);
}