01背包
#include <stdio.h>
int c[101][1001]={0};//定义100个物品1000重量的总价值数组
void calcMaxValues(int n,int t_w)
{
int i,j;
int w[101]={0},v[101]={0};//w单个物品的重量,v单个物品的价值
for(i=1;i<=n;i++){
scanf("%d%d",&w[i],&v[i]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=t_w;j++){
if(w[i]<=j){
if(v[i]+c[i-1][j-w[i]]>c[i-1][j]){
c[i][j]=v[i]+c[i-1][j-w[i]];
}
else{
c[i][j]=c[i-1][j];
}
}
else{
c[i][j]=c[i-1][j];
}
}
}
printf("%d",c[n][t_w]);
}
int _tmain(int argc, _TCHAR* argv[])
{
int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
scanf("%d%d",&num,&weight);
calcMaxValues(num,weight);
getchar();
return 0;
}
01背包的空间优化版
#include <stdio.h>
int c[1001]={0};//空间优化
void calcMaxValueAboutBagpack_optimize(int n,int t_w)
{
int i,j;
int w[101]={0},v[101]={0}; //w单个物品的重量,v单个物品的价值
for(i=1;i<=n;i++){
scanf("%d%d",&w[i],&v[i]);
}
for(i=1;i<=n;i++)//n件物品
{
for(j=t_w;j>0;j--){//物品的重量,或者说是容量 用逆序保存
if(w[i]<=j &&(v[i]+c[j-w[i]])>c[j]){ //如果重量可以放得下,且放下的值之和大于当前要放下位置的值
c[j]=v[i]+c[j-w[i]];
}
}
}
printf("%d",c[t_w]);
}
int main()
{
int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
scanf("%d%d",&num,&weight);
calcMaxValueAboutBagpack_optimize(num,weight);
getchar();
return 0;
}
完全背包
都是空间优化过的,这个还可以进行优化。如果物品A的价值小于物品B的价值,且物品A的容量大于物品B,那么物品A不用考虑。
#include <stdio.h>
int c[1001]={0};//空间优化
void FullBagpack(int n,int t_w)
{
int i,j;
int w[101]={0},v[101]={0}; //w单个物品的重量,v单个物品的价值
for(i=1;i<=n;i++){
scanf("%d%d",&w[i],&v[i]);
}
for(i=1;i<=n;i++)//n件物品
{
for(j=1;j<=t_w;j++){//物品的重量,或者说是容量 用逆序保存
if(w[i]<=j &&(v[i]+c[j-w[i]])>c[j]){ //如果重量可以放得下,
且放下的值之和大于当前要放下位置的值
c[j]=v[i]+c[j-w[i]];
}
}
}
printf("%d",c[t_w]);
}
int _tmain(int argc, _TCHAR* argv[])
{
int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
scanf("%d%d",&num,&weight);
FullBagpack(num,weight);
getchar();
return 0;
}
多层背包
空间优化过
#include <stdio.h>
int c[1001]={0};//空间优化
void calcMaxValueAboutMultipleBagpack_optimize(int t_n,int t_w)
{
int i,j;
int w[101]={0},v[101]={0},n[101]={0}; //w单个物品的重量,v单个物品的价值,n表示每个物品的件数
for(i=1;i<=t_n;i++){
scanf("%d%d%d",&w[i],&v[i],&n[i]);
}
for(i=1;i<=t_n;i++)//n件物品
{
for(j=t_w;j>0;j--){//物品的重量,或者说是容量 同样用01背包逆序储存解决空间量的问题
if(w[i]<=j){ //如果重量可以放得下
int cur_max_w=j/w[i];//cur_max_w表示能放下当前最大物品重量的几倍
if(cur_max_w>=n[i]){//如果当前能放下的个数小于或等于该物品设定的个数
if (v[i]*n[i]+c[j-w[i]*n[i]]>c[j]) //且当前物品的价值*该物品的数量+没放入该物品*数量时的价值 是否大于当前总价值
{
c[j]=v[i]*n[i]+c[j-w[i]*n[i]];
}
}
else{
if (v[i]*cur_max_w+c[j-w[i]*cur_max_w]>c[j]) //且当前物品的价值*该物品的数量+没放入该物品*数量时的价值 是否大于当前总价值
{
c[j]=v[i]*cur_max_w+c[j-w[i]*cur_max_w];
}
}
}
}
//打印表格看看是否与预期的一样
for(int k=1;k<=t_w;k++)
{
printf("%d ",c[k]);
}
printf("\n");
}
printf("%d",c[t_w]);
}
int main()
{
int num,weight;/*num表示物品的件数,weight表示能装下物品的总重量*/
scanf("%d%d",&num,&weight);
calcMaxValueAboutMultipleBagpack_optimize(num,weight);
getchar();
return 0;
}
说明:_tmian 是vs2010开发环境生成的,换成mian即可。