这个题目的体积很大,但是价值却很小,最多是1e5,我们可以转变背包体积概念,把价值当作体积,然后体积当作 DP 值。
dp[i] 表示的是达到i价值所需的最小的体积
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
const int M=105;
int dp[N]; //代表i个钱的最小体积
int t[M],w[M];
void solve(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i]>>t[i];
}
memset(dp,0x3f,sizeof dp);
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=100000;j>=t[i];j--){
dp[j]=min(dp[j],dp[j-t[i]]+w[i]);
}
}
for(int i=100000;i>=0;i--){
if(dp[i]<=m){
cout<<i;
return;
}
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
//cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
标签:const,int,long,体积,Knapsack,1e5,dp
From: https://www.cnblogs.com/yufan1102/p/17924286.html