1. 程式人生 > >BZOJ 1618 [Usaco2008 Nov] Buying Hay 購買乾草【揹包DP】

BZOJ 1618 [Usaco2008 Nov] Buying Hay 購買乾草【揹包DP】

其實就是一個完全揹包。

問題在於至少要買HH磅乾草。

然後我們發現出售的乾草最多50005000磅,所以只需要在做完全揹包的時候擴大一下揹包的範圍然後結果取最小即可。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define repl(i,x,y) for(ll i=(x);i<(y);i++)
#define repd(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;

const ll N=1e2+5;
const ll M=6e4+5; 
const ll Inf=1e18;

ll n,m,ans=Inf,p[N],c[N],f[M];

inline ll read() {
	ll x=0;char ch=getchar();bool f=0;
	while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f?-x:x;
}

int main() {
	n=read(),m=read();
	
	rep(i,1,n) p[i]=read(),c[i]=read();
	
	memset(f,127,sizeof(f));f[0]=0;
	
	rep(i,1,n) rep(j,p[i],M-5) f[j]=min(f[j],f[j-p[i]]+c[i]);
	
	rep(j,m,M-5) ans=min(ans,f[j]);
	
	printf("%lld",ans);
	
	return 0;
}