回溯01

来源:互联网 发布:unity3d 刚体移动 编辑:程序博客网 时间:2024/05/17 14:18
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int VM[209][2009];int n=0,m=0,w[209],v[209],result[209]={0},best=0,sum=0,x[209]={0};int Constraint(int t){    if (w[t]>m) return 0;    else return 1;}int Bound(int t){    int s=0,l=0;    for (int i=0;i<=t;i++)        if (x[i]==1) {s=s+w[i];l=l+v[i];}       if (s>m) return 0;       else return 1;}void Backtrack(int t){    if (t>=n)    {        int sm=0;        sum=0;        for (int i=0;i<n;i++)            {                sm=sm+x[i]*w[i];                if (sm>m) return ;                if (x[i]==1)                sum=sum+v[i];            }        if (sum>best)        {            best=sum;            for (int i=0;i<n;i++)                result[i]=x[i];        }        return ;    }        else            for (int i=0;i<=1;i++)        {            x[t]=i;           if (Bound(t)&&Constraint(t)) Backtrack(t+1);        }}main(){    memset(VM,0,sizeof(VM));    freopen("input.txt","r",stdin);    scanf("%d",&m);scanf("%d",&n);    for (int i=0;i<n;i++)    {        scanf("%d",&w[i]);        scanf("%d",&v[i]);    }        best=1000;        Backtrack(0);        printf("%d",best);printf("\n");        for (int i=0;i<n;i++)        {            printf("%d ",i+1);            printf("%d\n",result[i]);        }        fclose(stdin);}

0 0
原创粉丝点击