1 条题解
-
0I_am_Chinese_qwq LV 8 MOD @ 2020-03-02 10:57:33
简单完全背包,dp[i]表示当体力为i时的最大价值,则有:\[ dp(j)=\max(dp(j),dp(j-B_i)+A_i) \]
再从前往后找一遍最小可行值就行了,我是用顺序查找的,貌似可以二分。
最后贴上高清无注释代码。
#include <cstdio> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #define For(i,j,k) for(int i=j;i<=(k);++i) using namespace std; typedef long long ll; inline int read(){ int x=0,w=0;char c=getchar(); for(;c<'0'||c>'9';w^=c=='-',c=getchar()); for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^48),c=getchar()); return w?-x:x; } int qpow(int n,int m,int k){ //n^m%k if(m==0) return 1; int ans=qpow(n,m/2,k)%k; if(m%2) return ans*ans%k*ans%k; return ans*ans%k; } int dp[500005]; int main(){ int v,n;scanf("%d%d",&v,&n); while(n--){ int a,b;scanf("%d%d",&a,&b); for(int i=b;i<=500000;++i){ dp[i]=max(dp[i],dp[i-b]+a); } } for(int i=0;i<=500000;++i){ if(dp[i]>=v){ printf("%d",i); return 0; } } return 0; }
- 1