nyoj325_zb的生日(深搜+01背包)

来源:互联网 发布:网友知乎 编辑:程序博客网 时间:2024/06/06 01:49

原题链接》》》


深搜的解法:

#include<stdio.h>#include<string.h>#include<math.h>int N,total;int A[21];int min;void dfs(int cur,int num){    int t=(int)fabs(total-2*num);    if(min>t)    min=t;    if(num>total/2) return ;    for(int i=cur+1;i<N;i++)    dfs(i,num+A[cur]);}int main(){    int i;     while(scanf("%d",&N)!=EOF){        total=0;min=20000;        for(i=0;i<N;i++){            scanf("%d",&A[i]);            total+=A[i];        }        dfs(-1,0);        printf("%d\n",min);    }    return 0;} 

01背包的做法:(险过!!)

#include<stdio.h>#include<string.h>int main(){    int N,i,total,t,temp;int x[100005];int w[21];    while(scanf("%d",&N)!=EOF){        total=0;        memset(x,0,sizeof(x));        for(i=0;i<N;i++){            scanf("%d",&w[i]);            total+=w[i];        }        t=total/2;        for(i=0;i<N;i++){            for(int j=t;j>=w[i];j--){                temp=x[j-w[i]]+w[i];                if(x[j]<temp)                x[j]=temp;            }        }        printf("%d\n",total-2*x[total/2]);    }    return 0;} 
0 0
原创粉丝点击