hdu 1171 Big Event in HDU(母函數)

來源:互聯網
上載者:User

標籤:母函數   hdu   

連結:hdu 1171

題意:這題可以理解為n種物品,每種物品的價值和數量已知,現要將總物品分為A,B兩部分,

使得A,B的價值儘可能相等,且A>=B,求A,B的價值分別為多少

分析:這題可以用母函數的思想解,不過求的不是方案數,而是判斷儘可能接近總價值的一半的方案是否存在.

也可以用背包思想,每種物品的價值和數量已知,可以將總價值的一半作為容量,求最大價值,也就最接近所求值了


註:數組要開的稍微大一點,否則可能WA

#include<stdio.h>#include<string.h>int c1[300010],c2[300010],w[300010],num[300010],n;void mhs(int m){    int i,j,k;    memset(c1,0,sizeof(c1));    memset(c2,0,sizeof(c2));    for(i=0;i<=w[1]*num[1];i+=w[1])         //將第一種物品形成的情況初始化為1        c1[i]=1;    for(i=2;i<=n;i++){        for(j=0;j<=m;j++)            for(k=0;k<=w[i]*num[i]&&j+k<=m;k+=w[i])                c2[j+k]+=c1[j];        for(j=0;j<=m;j++){            c1[j]=c2[j];            c2[j]=0;        }    }}int main(){    int m,i,s;    while(scanf("%d",&n)!=EOF){        if(n<0)            break;        s=0;        for(i=1;i<=n;i++){            scanf("%d%d",&w[i],&num[i]);       //w數組表示i物品的價值,num數組表示i物品的數量            s+=w[i]*num[i];                   //求出所有物品的總價值        }        if(n==0){                           //當物品為0時,A,B肯定都為0            printf("0 0\n");            continue;        }        m=s/2;                 mhs(m);                 //用母函數求s/2的方案情況        for(i=m;i>=0;i--)       //求<=m最大的滿足題意的值            if(c1[i])                           break;        printf("%d %d\n",s-i,i);    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.