P1048 [NOIP2005 普及组] 采药 题解
P1048 [NOIP2005 普及组] 采药
解法一
#include<iostream> #include<cstring> 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<<dp[n][V]<<endl; return 0; } /* in 10 4 2 1 3 3 4 5 7 9 out 12 */
解法二
#include<iostream> using 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<<f[t]<<"\n"; return 0; }