题目描述: 01背包板子
思路:
如果dp 表示 体积为j的最大价值,发现体积最大 1 e 9 1e9 1e9,存不下,那么我们可以转换思路dp[j]:表示价值为j下最小的体积,然后倒找第一个不超过W的价值;
code
/*
author:@bzdhxs
date:2022/1/1
URL:https://nyoj.online/problem/860
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<queue>
using namespace std;
template <typename T>
inline void read(T &s){s = 0;T w = 1, ch = getchar();while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^48); ch = getchar();} s *= w;}
template <typename T>
inline void write(T s){if (s < 0) putchar('-'), s = -s;if (s > 9) write(s / 10);putchar(s % 10 + '0');}
#define _orz ios::sync_with_stdio(false),cin.tie(0)
#define mem(str,num) memset(str,num,sizeof(str))
#define forr(i,a,b) for(int i = a; i <= b;i++)
#define forn(i,n) for(int i = 0; i < n; i++)
#define dbg() cout <<"0k!"<< endl;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e4+10;
int n,m;
int v[110],w[110];
int f[N+1];
int main()
{
while(cin >> n >> m){
int sum = 0;
forr(i,1,n) cin >> v[i] >> w[i],sum += w[i];
mem(f,inf);//初始化为无穷大 const int inf = 0x3f3f3f3f;
f[0] = 0;
forr(i,1,n)for(int j = N; j >= w[i]; j--){
f[j] = min(f[j],f[j-w[i]]+v[i]);
}
for(int i = N; i>=0;i--){
if(f[i] <= m) {
cout << i << endl;
break;
}
}
}
return 0;
}