裸的01背包,注意背包的容量不是v即可。
#include#include #include #include #include #include using namespace std;#define rep(i, n) for(int i=0; i<(n); ++i)#define for1(i,a,n) for(int i=(a);i<=(n);++i)#define for2(i,a,n) for(int i=(a);i<(n);++i)#define for3(i,a,n) for(int i=(a);i>=(n);--i)#define for4(i,a,n) for(int i=(a);i>(n);--i)#define CC(i,a) memset(i,a,sizeof(i))#define read(a) a=getint()#define print(a) printf("%d", a)#define dbg(x) cout << #x << " = " << x << endl#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }inline const int max(const int &a, const int &b) { return a>b?a:b; }inline const int min(const int &a, const int &b) { return a >1;int f[50005+5005], v[N], w[N], n, V;int main() { read(n); read(V); int mx=0; for1(i, 1, n) { read(v[i]); read(w[i]); mx=max(v[i], mx); } for1(i, 1, V+mx) f[i]=oo>>1; for1(i, 1, n) { for(int j=v[i]; j<=mx+V; ++j) f[j]=min(f[j], f[j-v[i]]+w[i]); } int ans=oo; for(int j=V; j<=mx+V; ++j) ans=min(ans, f[j]); print(ans); return 0;}
Description
约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草.
他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号. 第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅,需要的开销为Ci(l≤Ci≤5000)美元.每个干草公司的货源都十分充足,可以卖出无限多 的干草包. 帮助约翰找到最小的开销来满足需要,即采购到至少H磅干草.
Input
第1行输入N和日,之后N行每行输入一个Pi和Ci.
Output
最小的开销.
Sample Input
2 15 3 2 5 3
Sample Output
9 FJ can buy three packages from the second supplier for a total cost of 9.