Loading

DP_Training E. 01背包变形

DP_Training E. 01背包变型

题意

与01背包相同,\(W\)表示背包容量,\(w_i\)表示物品体积,\(v_i\)表示物品价值

\[1\leq N \leq 100\\ 1\leq W \leq 10^9\\ 1\leq w_i \leq W\\ 1\leq v_i \leq 10^3 \]

分析

我们知道01背包的复杂度是\(O(nV)\)的,\(V\)是背包体积

但是此题的\(V\)很大。这显然是不行的,但是注意到\(Nv_i\)最多只有1e5,想到设计DP

\(dp[i]\)表示价值达到\(i\)所需要的最小体积是多少,答案就是第一个\(<=W\)\(i\)

转移方程

\[dp[j] = min(dp[j - v[i]] + w[i]) \]

代码

ll f[maxn];
ll w[maxn];
ll v[maxn];

int main(){
	int n = rd();
	int V = rd();
	for(int i = 0;i < n;i++)
		v[i] = rd(),w[i] = rd();
	ll c = 0;
	for(int i = 0;i < n;i++)
		c += w[i];
	for(int i = 0;i <= c;i++)
		f[i] = 1e9;
	f[0] = 0;
	for(int i = 0;i < n;i++)
		for(int j = c;j >= w[i];j--)
			f[j] = min(f[j],f[j - w[i]] + v[i]);
	for(int i = c;i >= 0;i--)
		if(f[i] <= V) {
			printf("%lld\n",i);
			break;
		}
}
posted @ 2021-02-05 22:00  MQFLLY  阅读(78)  评论(0编辑  收藏  举报