nyoj106_背包问题(贪心or多重背包解法)

来源:互联网 发布:惠州综合网络问政平台 编辑:程序博客网 时间:2024/06/08 02:46

原题链接》》》


多重背包解法:

三种背包问题模板链接》》》

#include<stdio.h>#include<string.h>#define Nmax 11int v[Nmax];int w[Nmax];int dp[21];int m;void zobag(int v,int w){    for(int i=m;i>=w;i--)    if(dp[i]<dp[i-w]+v)    dp[i]=dp[i-w]+v;}void combag(int v,int w){    for(int i=w;i<=m;i++)    if(dp[i]<dp[i-w]+v)    dp[i]=dp[i-w]+v;}void multibag(int v,int w,int c){    if(c*w>m)    combag(v,w);    else{        int k=1;        while(k<c){            zobag(v*k,w*k);            c-=k;            k*=2;        }        zobag(v*c,w*c);    }}int main(){    int N,s,i,j;    scanf("%d",&N);    while(N--){        memset(dp,0,sizeof(dp));        scanf("%d%d",&s,&m);        for(i=0;i<s;i++)        scanf("%d%d",&v[i],&w[i]);        for(i=0;i<s;i++)        multibag(v[i],1,w[i]);        printf("%d\n",dp[m]);    }    return 0;} 

贪心的解法:

#include<stdio.h>#include<stdlib.h>struct In{    int v;    int w;}dd[10];int cmp(const void*a,const void*b){    struct In*c=(In*)a;    struct In*d=(In*)b;    return d->v-c->v;}int main(){    int T,s,m,i;    scanf("%d",&T);    while(T--)    {        int pout=0;        scanf("%d%d",&s,&m);        for(i=0;i<s;i++)        scanf("%d%d",&dd[i].v,&dd[i].w);        qsort(dd,s,sizeof(dd[0]),cmp);        i=0;        while(1)        {            if(m<=dd[i].w){                pout+=m*dd[i].v;                break;            }            else{                pout+=dd[i].w*dd[i].v;                m-=dd[i].w;                i++;            }        }        printf("%d\n",pout);    }    return 0;  }
0 0
原创粉丝点击