poj 3628 Bookshelf 2 (01揹包)

給出n個數,求他們部分疊加起來大於m的最小和

#include<stdio.h>
#include<string.h>
bool dp[20000010];
int c[22];
int main()
{
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
                int sum=0;
                for(int i=1;i<=n;i++)
                {
                        scanf("%d",&c[i]);
                        sum+=c[i];
                }
                memset(dp,false,sizeof(dp));
                dp[0]=true;
                for(int i=1;i<=n;i++)
                {
                        for(int j=sum;j>=c[i];j--)
                        {
                                if(dp[j-c[i]])
                                        dp[j]=true;
                        }
                }


                for(int j=m;j<=sum;j++)
                {
                        if(dp[j])
                        {
                                printf("%d\n",j-m);
                                break;
                        }
                }
        }
        return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章