题意:给出n(n<=200)块黄铜合金,每块具有铜含量和价钱。
给出C个询问 , 形如: 在n块中取 M 块 使得这M块合金的铜含量在[cMin * M, cMax * M]这个区间所花费的最少价钱。
分析:0/1背包 f[k][j] 表示选k块合金得到含量j的最小开销。
f[k,j] = min f[k-1, j-v[i] ) + pri[i] , 有多个询问,但合金不变,所以预处理出所有情况。
const int M=201; int n, m, v[M], w[M]; int num, cmin, cmax; int f[21][20005]; int main(){ scanf("%d",&n); FOE(i, 1, n) scanf("%d%d",&v[i],&w[i]); memset(f,1,sizeof(f)); f[0][0]=0; FOE(i, 1, n) FOD(k, 20<i?20:i, 1) FOD(j, 20000, v[i]) checkmin(f[k][j], f[k-1][j-v[i]] + w[i]);// scanf("%d",&m); while(m--){ scanf("%d%d%d", &num, &cmin, &cmax); cmin *= num; cmax *= num; int ans = 99999999; FOE(j, cmin, cmax) if(f[num][j]<1500000) checkmin(ans, f[num][j]); if(ans==99999999) printf("impossible\n"); else printf("%d\n",ans); } return 0; }