P1048 [NOIP2005 普及组] 采药 题解
P1048 [NOIP2005 普及组] 采药
解法一
#include#include using namespace std; const int Maxn=110; const int Maxv=1010; int V,n,ans=0; int w[Maxn],c[Maxn]; int dp[Maxn][Maxv]; void dfs(int i,int v) { if (dp[i][v]!=-1) return ; if (i==0) { dp[i][v]=0; } else { dfs(i-1,v); dp[i][v]=dp[i-1][v]; if (v>=w[i]) { dfs(i-1,v-w[i]); dp[i][v]=max(dp[i-1][v],dp[i-1][v-w[i]]+c[i]); } } } int main() { cin>>V>>n; for (int i=1;i<=n;i++) { cin>>w[i]>>c[i]; } memset(dp,-1,sizeof(dp)); dfs(n,V); cout< 解法二
#includeusing namespace std; int f[1001]; int zy[101][2]; int max(int a,int b) { return a>b?a:b; } int main() { int t,m; cin>>t>>m; for(int i=1;i<=m;i++) { cin>>zy[i][0]>>zy[i][1]; } for(int i=0;i<=t;i++) { f[i]=0; } for(int i=1;i<=m;i++) { for(int j=t;j>=zy[i][0];j--) { f[j]=max(f[j],f[j-zy[i][0]]+zy[i][1]); } } cout<