列表

详情


NC54710. 背包问题

描述

牛妹家里有个物品,第个物品体积为v_i,价值为w_i。牛妹有一个容积无穷大的背包,背包可以装任意多的物品,没有限制。

牛妹要去深山中度假,为了在旁人眼中显得自己准备得很充分,牛妹想在背包中装入总体积不小于的一些物品。如果装入的物品过于贵重,路上如果遇到强盗、劫匪、山贼等就很亏。所以牛妹想知道总体积不小于的前提下,物品的总价值最小是多少。

输入描述

第一行两个整数,表示物品的数量和总体积需求。
接下来行,每行两个整数v_i,w_i,表示第种物品的体积和价值。保证所有物品总体积不小于
。保证所有物品总体积不小于

输出描述

输出一个整数,表示答案。

示例1

输入:

3 6
2 5
3 4
4 3

输出:

7

说明:

选择第2和第3个物品。

示例2

输入:

6 10
2 4
3 4
4 5
5 11
6 10
7 11

输出:

15

说明:

选择第3和第5个物品,或者第2和第6个物品。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3(pypy3.6.1) 解法, 执行用时: 73ms, 内存消耗: 19624K, 提交时间: 2021-04-17 11:17:51

N, V = map(int, input().split())

f = []
v = [0]
w = [0]

max_w = 0
for i in range(1, N + 1):
    a, b = map(int, input().split())
    max_w += b
    v.append(a)
    w.append(b)

f = [0] * (max_w + 1)
for i in range(1, N + 1):
    for j in range(max_w, w[i] - 1, -1):
        f[j] = max(f[j], f[j - w[i]] + v[i])

for i in range(len(f)):
    if f[i] >= V:
        print(i)
        break

Python3(3.5.2) 解法, 执行用时: 1573ms, 内存消耗: 4420K, 提交时间: 2019-12-14 23:42:08

n, V = [int(x) for x in input().split()]
v = []
w = []
for i in range(n):
    vi, wi =[int(x) for x in input().split()]
    v.append(vi)
    w.append(wi)
ws = sum(w)
f = [0 for i in range(ws+1)]
tmp = 0
for vi, wi in zip(v,w):
    tmp += wi
    for j in range(tmp, wi-1, -1):
        f[j] = max(f[j], f[j-wi]+vi)
ans = 0
while f[ans] < V:
    ans += 1
print(ans)

C++(clang++ 11.0.1) 解法, 执行用时: 242ms, 内存消耗: 4360K, 提交时间: 2023-07-08 17:15:46

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int N=202;
int n,V;
vector<int>dp(1000000,INF);
int v[N],w[N];
void solve()
{
	for(int i=1;i<=n;i++)
	for(int j=V;j>=0;j--)
	dp[j]=min(dp[j],dp[max(0,j-v[i])]+w[i]);
}
int main()
{
	cin>>n>>V;
	dp[0]=0;
	for(int i=1;i<=n;i++)
	cin>>v[i]>>w[i];
	solve();
	cout<<dp[V]<<endl;
}

上一题