FAFU OJ 0-1背包问题
原创
©著作权归作者所有:来自51CTO博客作者兔云程序的原创作品,请联系作者获取转载授权,否则将追究法律责任
0-1背包问题
Time Limit: |
2000MS |
Memory Limit: |
65536KB |
Total Submissions: |
125 |
Accepted: |
52 |
Share
Description:
给定n 种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?,并输出最佳装包方案
Input:
输入文件Knap.in有3行,第1 行有2 个正整数n 和C,分别表示有n种物品,背包的容量为C。接下来的2 行中,每行有n 个数,分别表示各物品的价值和重量(重量各不相同)。
Output:
输出文件Knap.out有2行,第1行是最大价值,第2行是最佳装包方案。
Sample Input:
Sample Output:
Hint:
Source:
#include<stdio.h>
int n;
int c;
int cw;
int cp;
int bestp=0;
int pr;
int p[1005],w[1005],x[1005],bestx[1005];
int constraint( int t)
{
if((x[t]==0) || (x[t]==1 && cw+w[t]<=c)) return 1;
else return 0;
}
int bound(int t)
{
int i;
pr=0;
for(i=t+1;i<=n;i++)
pr=pr+p[i];
if((x[t]==1)||(x[t]==0&&pr+cp>=bestp)) return 1;
else return 0;
}
void backtrack(int t)
{
int i;
if(t>n)
{
bestp=cp;
for(i=1;i<=n;i++)
bestx[i]=x[i];
}
else
for(i=0;i<=1;i++)
{
x[t]=i;
if (constraint(t)&&bound(t))
{
if(x[t]==1)
{
cw=cw+w[t];
cp=cp+p[t];
}
backtrack(t+1);
if(x[t]==1)
{
cw=cw-w[t];
cp=cp-p[t];
}
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&c);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
for(j=1;j<=n;j++)
scanf("%d",&w[j]);
backtrack(1);
printf("%d\n",bestp);
printf("%d",bestx[1]);
for(i=2;i<=n;i++)
printf(" %d",bestx[i]);
return 0;
}