0/1背包问题

来源:互联网 发布:淘宝床上用品货源 编辑:程序博客网 时间:2024/06/06 03:38

题目

  有N件物品和一个容量为V的背包。第i件物品的重量是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

   蛮力法:

  

#include<stdio.h>#define N 10void main(){    int w[]={7,3,4,5};    int v[]={42,12,40,25};    int i,j,k;    int ii,jj,kk;    int vsum=0,wsum=0,Vmax=0,Wm=0;    for(i=0;i<4;i++)for(j=0;j<4;j++)    if(i<=j)    {vsum=wsum=0;for(k=i;k<=j;k++){    wsum+=w[k];    vsum+=v[k];}printf("总量:%d,价值:%d ;子集:",wsum,vsum);for(kk=i;kk<=j;kk++)    printf("%d  ",kk+1);printf("\n");if(wsum<=10 && Vmax <=vsum){    Vmax=vsum;    Wm=wsum;    ii=i;    jj=j;}    }    int a=0;    for(a=ii;a<=jj;a++)printf("物品%d  ",a+1);    printf(" \n总重量:%d,总价值:%d \n",Wm,Vmax);}

  动态规划法:

#include<stdio.h>#define C 10#define N 5int KnapSack(int,int w[],int v[]);int max(int a,int b);void main(){int w[]={2,2,6,5,4};int v[]={6,3,5,4,6};int num=KnapSack(N,w,v);printf("最优解:%d \n",num);}int KnapSack( int n, int w[],int v[]){int V[n+1][C+1];int x[n];int i,j;int a,b;int sum=0;for(i=0;i<=n;i++)V[i][0]=0;for(j=0;j<=C;j++)V[0][j]=0;for(i=1;i<=n;i++)for(j=1;j<=C;j++){if(w[i-1]>j){V[i][j]=V[i-1][j];}else{a=V[i-1][j];b=V[i-1][j-w[i-1]]+v[i-1];V[i][j]=max(a,b);}printf("v[%d][%d]=%d \n",i,j,V[i][j]);}j=C;for(i=n;i>0;i--){if(V[i][j]>V[i-1][j]){x[i]=1;j=j-w[i-1];printf("x[%d]= %d\n",i,x[i]);}else{x[i]=0;printf("x[%d]=%d \n",i,x[i]);}}return  V[n][C];}int max(int a,int b){     if (a>=b) return a; else return b;}