FAFU OJ 0-1背包问题

来源:互联网 发布:有趣的淘宝收货人名字 编辑:程序博客网 时间:2024/05/16 17:32
0-1背包问题
Time Limit:2000MSMemory Limit:65536KBTotal Submissions:125Accepted:52Share
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:
5 10
6 3 5 4 6
2 2 6 5 4
Sample Output:
15
1 1 0 0 1
Hint:
n<=100,C<=1000
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;}


原创粉丝点击