01背包问题

1:纯递归解法

 1 #include<iostream>
 2 #include<cstring>
 3 int w[100],v[100],n,p;
 4 using namespace std;
 5 int beibao(int i,int sumw)
 6 {
 7     if(i==n+1||p-sumw<w[i])
 8     return 0;
 9     return max(beibao(i+1,sumw),beibao(i+1,sumw+w[i])+v[i]);
10 }
11 int main()
12 {
13     while(cin>>p>>n)
14     {
15     for(int i=1;i<=n;i++)
16     cin>>w[i]>>v[i];
17     cout<<beibao(1,0)<<endl;
18     memset(w,0,sizeof(w));
19     memset(v,0,sizeof(v));
20     }
21     


2:dp解法(运用打表的方法记录最优解)

用空间换时间

#include<iostream>
#include<cstring>
using namespace std;
int w[10000],v[10000],p,n;
int dp[1001][10001];
int beibao()
{
   for(int i=1;i<=n;i++)
   for(int j=1;j<=p;j++)
   {
       if(w[i]<=j)
       dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
       else
       dp[i][j]=dp[i-1][j];
   }
   return dp[n][p];
}
int main()
{
    while(cin>>p>>n)
    {
    for(int i=1;i<=n;i++)
     cin>>w[i]>>v[i];
     cout<<beibao()<<endl;
     memset(w,0,sizeof(w));
     memset(v,0,sizeof(v));
     memset(dp,0,sizeof(dp));
    }
 return 0;
}

 

posted on 2018-12-04 21:14  mircle_leo  阅读(88)  评论(1)    收藏  举报