\[ dp(i,j)= \left\{\begin{array}{rcl} max(dp(i-1,j-c[i])+v[i],dp(i-1,j)) & j>=c[i]\ dp(i-1,j) & j<c[i] \end{array}\right. \]
\[ dp(d,j)= \left\{\begin{array}{rcl} max(dp(!d,j-c[i])+v[i],dp(!d,j))&j>=c[i]\ dp(!d,j)&j<c[i] \end{array}\right. \]
\[ dp[j]=max(dp[j-c[i]]+v[i],dp[j]) \]
\[ O(NM) \]
\[ O(m) \]
\[ dp[j]|=dp[j-c[i]] \]
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 5001
#define maxm 50001
using namespace std;
bool dp[maxm];
int n,m,c[maxn];
inline int read(){
register int x(0),f(1); register char c(getchar());
while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int main(){
m=read(),n=read();
for(register int i=1;i<=n;i++) c[i]=read();
dp[0]=true;
for(register int i=1;i<=n;i++){
for(register int j=m;j>=c[i];j--) if(dp[j-c[i]]){
dp[j]=true;
}
}
for(register int i=m;i>=0;i--) if(dp[i]){
printf("%d\n",i); break;
}
return 0;
}
[Usaco2008 Dec]Hay For Sale 购买干草
原文:https://www.cnblogs.com/akura/p/10846620.html