Description
约翰的干草库存已经告罄,他打算为奶牛们采购磅干草.
他知道个干草公司,现在用1到给它们编号.第个公司卖的干草包重量为磅,需要的开销为美元.每个干草公司的货源都十分充足,可以卖出无限多的干草包.
帮助约翰找到最小的开销来满足需要,即采购到至少磅干草.
Input
第1行输入和.
接下来N行每行输入一个和.
Output
一行一个整数,表示最小的开销.
Sample Input
2 153 2
5 3
Sample Output
9
HINT
Solution
裸的完全背包问题.
表示前个公司中已经购买了磅干草的最小开销.
(即买与不买第i个家公司的干草)
注:题目要求的不是,而是即可.
#include<cmath> #include<ctime> #include<queue> #include<stack> #include<cstdio> #include<vector> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 105 #define M 50005 #define INF 1000000000 using namespace std; int f[N][M],p[N],c[N],n,m; inline void init(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d%d",&p[i],&c[i]); for(int i=0;i<=n;++i) for(int j=1;j<=m;++j) f[i][j]=INF; for(int i=1;i<=n;++i){ for(int j=p[i];j<=m;++j) f[i][j]=min(f[i][j],min(f[i-1][j-p[i]],f[i][j-p[i]])+c[i]); for(int j=0;j<p[i];++j) f[i][m]=min(f[i][m],min(f[i-1][m-j],f[i][m-j])+c[i]); for(int j=1;j<=m;++j) f[i][j]=min(f[i][j],f[i-1][j]); } printf("%d\n",f[n][m]); } int main(){ freopen("grass.in","r",stdin); freopen("grass.out","w",stdout); init(); fclose(stdin); fclose(stdout); return 0; }