POJ 2642 The Brick Stops Here 0-1背包

来源:互联网 发布:mac如何复制文字 编辑:程序博客网 时间:2024/06/08 08:41

poj: http://poj.org/problem?id=2642

大意:

给出n(n<=200)块黄铜合金,还有它们的浓度和价钱。给出若干个个询问使它们在n块中取 M 块 使得这M块合金的浓度在[cMin*M, cMax*M]这个区间内所花费的价格最少。

这里很详细了。。。。http://blog.sina.com.cn/s/blog_9b95c19e010192vl.html

设计状态dp [i][j][v]表示在i个中买不超过价值为v的物品j件。


include<cstdio>const int INF=999999;const int MAXN=20000+10;int w[201],p[201];int dp[21][MAXN];int main(){int N,M;scanf("%d",&N);for(int i=1;i<=N;i++)scanf("%d%d",&w[i],&p[i]);for(int i=0;i<21;i++)for(int j=0;j<MAXN;j++)dp[i][j]=INF;int maxnum= N >20? 20: N;dp[0][0]=0;for(int i=1;i<=N;i++){for(int j=20000;j>=w[i];j--)for(int k=1;k<=maxnum;k++)if(dp[k-1][j - w[i] ]!=INF)dp[k][j] = dp[k][j] < ( dp[k-1][j - w[i] ]+ p[i] )? dp[k][j] : ( dp[k-1][j - w[i] ]+ p[i] );}int kase;scanf("%d",&kase);for(int ri=0;ri<kase;ri++){int L,R;scanf("%d%d%d",&M,&L,&R);L*=M;R*=M;int ans=INF;for(int i=L;i<=R;i++)if(ans > dp[M][i] )ans=dp[M][i];if(ans==INF)printf("impossible\n");elseprintf("%d\n",ans);}}


原创粉丝点击