背包问题的多个解法

来源:互联网 发布:低音炮蓝牙音响淘宝 编辑:程序博客网 时间:2024/05/19 03:44
/*最基本的做法*/#include<iostream>using namespace std;int n,weight,w[100],v[100],maxv=0,sum=0;int max(int x,int y){return x>y?x:y; }int m(int x,int y){int sum;if(x==n) return 0;else if(y<w[x]){sum=m(x+1,y);}else sum=max(m(x+1,y),m(x+1,y-w[x])+v[x]);return sum;}int main(){int i,j;cin>>n>>weight;for(i=0;i<n;i++)cin>>w[i]>>v[i];cout<<m(0,weight)<<endl;return 0;}/*逆序求出背包所能容纳的最大值,通过a[0][j]输出,最大值存放在了a[0][weight]中,通过递推的发放编程解决这道背包问题*/#include<iostream>using namespace std;int max(int x,int y){return x>y?x:y;}int main(){int i,j,weight,n,w[100],v[100],dp[100][100];cin>>n>>weight;for(i=0;i<n;i++)cin>>w[i]>>v[i];for(i=n-1;i>-1;i--)for(j=0;j<=weight;j++){if(j<w[i]) dp[i][j]=dp[i+1][j];else dp[i][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);}cout<<dp[0][weight]<<endl;return 0;}/*顺序求出背包所能容纳的最大值,通过a[n][j]输出,最大值存放在了a[n][weight]中,通过递推的发放编程解决这道背包问题*/#include<iostream>using namespace std;int max(int x,int y){return x>y?x:y;}int main(){int i,j,weight,n,w[100],v[100],dp[100][100];cin>>n>>weight;for(i=0;i<n;i++)cin>>w[i]>>v[i];for(i=0;i<=n;i++)for(j=0;j<=weight;j++){if(j<w[i]) dp[i+1][j]=dp[i][j];else dp[i+1][j]=max(dp[i+1][j],dp[i][j-w[i]]+v[i]);}cout<<dp[n][weight]<<endl;return 0;}

0 0
原创粉丝点击