以下两段代码效果有什么区别?#include<iostream> #include<algorithm> using namespace std; const int N =1010; int f[N];//买前i道菜后,余额j>=5时的最大花费 int pri[N]; //主函数内存有限,尽量把大的的数组存到主函数外面 int n,m; int main(){ while(cin>>n){ if(n==0)break; for(int i=1;i<=n;i++){ cin>>pri[i]; } int mma = -1,pos; for(int i=1;i<=n;i++){ if(pri[i]>mma){ mma = pri[i]; pos = i; } } cin>>m;//余额 if(m<5){ cout<<m<<endl; continue; } for(int i=1;i<=n;i++){ if(i==pos)continue; for(int j=m-5;j>=pri[i];j--){ f[j] = max(f[j],f[j-pri[i]]+pri[i]); } } cout<<m-f[m-5]-mma<<endl;; } } 以上是第一个代码,以下是第二个#include <stdio.h> #include <string.h> #define MAX 1005 #define max(a,b) a>b?a:b int main() { int n,p[MAX],dp[MAX],m; //n菜的数量 //p菜的价格 //m卡上余额 while(~scanf("%d",&n) && n!= 0){ memset(dp,0, sizeof(dp)); memset(p,0, sizeof(p)); for(int i=0;i<n;i++){ scanf("%d",&p[i]); } scanf("%d",&m); int max=-2,pos; //max用于找到最大值 pos记录最大值的位置 for(int i=0;i<n;i++){ if(p[i]>max) { max=p[i]; pos=i; } } if(m<5){ printf("%d\n",m); continue; } for(int i=0;i<n;i++){ if(i==pos) continue; for(int j=m-5;j>=p[i];j--){ dp[j]=max(dp[j],dp[j-p[i]]+p[i]); } } printf("%d\n",m-dp[m-5]-max); } return 0; }
时间: 2024-04-18 18:33:23 浏览: 89
c++实现二叉查找树示例
这两段代码实现的功能是不同的。第一个代码是一个动态规划问题,用于计算在给定余额下购买一定数量的菜品后的最大花费。它使用了数组f来存储买前i道菜后,余额j>=5时的最大花费。在循环中,它首先找到价格最高的菜品,然后将其余额减去5,再循环遍历其他菜品,计算出每个余额下的最大花费,最后输出余额减去最大花费和最高价格菜品的差值。
第二个代码是一个背包问题,用于计算在给定余额下购买一定数量的菜品后的最大花费。它使用了数组dp来存储在余额j下的最大花费。在循环中,它首先找到价格最高的菜品,然后将其余额减去5,再循环遍历其他菜品,计算出每个余额下的最大花费,最后输出余额减去最大花费和最高价格菜品的差值。
总之,这两段代码在实现上有一些相似之处,但是细节和具体计算方式有所不同。
阅读全文