0-1背包问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
输入:
多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。
输出:
每个测例的输出占一行,输出一个整数,即最佳装载的总价值。
输入样例:
1 2 1 1 2 3 2 2 3 4 0 0
输出样例:
1 4
#include<iostream>
using namespace std;
int w[100],p[100],j[100];
int sum[100],temp[10000]={0}; //数组一定要定义足够大,否则数组将越界
int n,c,num=1;
int t=0;
int search(int m);
int max();
int main()
{
int i;
while(1)
{
cin>>n>>c;
if(n==0&&c==0)
{
break;
}
else
{
for(i=0;i<n;i++)
{
cin>>w[i];
}
for(i=0;i<n;i++)
{
cin>>p[i];
}
search(0); //调用函数
max(); //取最大值
for(i=0;i<10000;i++) //在每次调用函数后,要把temp数组还原
{
temp[i]=0;
}
t++; //t用来计数
}
}
for(i=0;i<t;i++)
{
cout<<sum[i]<<endl;
}
return 0;
}
int search(int m)
{
int i,weight=0;
if(m==n)
{
for(i=0;i<n;i++)
{
temp[num]=temp[num]+j[i]*p[i]; //用temp暂时存储总价值
weight=weight+j[i]*w[i];
}
if(weight>c)
{
temp[num]=0;
}
else
{
num=num+1;
}
return(m-1);
}
else
{
for(i=0;i<=1;i++)
{
j[m]=i;
search(m+1);
}
}
return 0;
}
int max() //比较每一个temp的大小,取最大值
{
int i,j;
for(i=1;i<=num;i++)
{
int flag=1;
for(j=0;j<=num;j++)
{
if(temp[i]<temp[j])
{
flag=0;
}
}
if(flag==1)
{
sum[t]=temp[i];
}
}
return 0;
}