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; }
浙公网安备 33010602011771号