POJ 2642 The Brick Stops Here 0-1背包
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"); else printf("%d\n",ans); } }
新 blog : www.hrwhisper.me