一维数组做0/1背包问题

来源:百度知道 编辑:UC知道 时间:2024/06/02 15:32:20
一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。

希望大牛能写出一维数组的程序,而不是用二维,
谢谢

#include<stdio.h>
#define N 5
int W[N],C[N];
main()
{
int sum,y,j;
int make(int s,int n) ;/*其返回值为价值 */
y=0;
printf("the object's weight and value:\n");/*物体的重量 与价值 */
for(j=0;j<N;j++)
scanf("%d%d",&W[j],&C[j]);

printf("total weight:\n");/*sum背包的承载量*/
scanf("%d",&sum);
y=make(sum,N);
printf("%d\n",y);

}

int make(int s,int n)
{
int i,p1,p2;

if(s<=0||n<=0)
i= 0; /*s表示背包盛量,s<=0 或者 n<=0,此时不放任何东西 价值 0*/
else if(s<W[n-1])
i=make(s,n-1);/* 存放不下 第n个物品 */
else
{
p1=make(s-W[n-1],n-1)+C[n-1]; /* 存放了 第n个物品 */
p2=make(s,n-1);/* 不存放 第n个物品 */
if(p1>p2) /*这里没有考虑 p1==p2的情况 这种情况下有多解,但是总价值是一样的 */
i=p1;
else i=p2;
}