饮料问题;动态规划;贪心没看懂;
2010-05-13 16:19
260 查看
#include <iostream> using namespace std; #define MIN -99999 void print(int **path,int space[],int v,int i,int n) { if(i==n+1) { return; } cout<<path[v][i]<<endl; print(path,space,v-path[v][i]*space[i],i+1,n); } int getMaxHappy(int amount[],int happy[],int space[],int n,int v) { int **maxHappy=new int*[v+1]; int **path=new int*[v+1]; for(int j=0;j<v+1;++j) { maxHappy[j]=new int[n+2]; path[j]=new int[n+2]; maxHappy[j][n+1]=0; } for(int i=0;i<n+2;++i) { maxHappy[0][i]=0; } for(int i=1;i<v+1;++i) { for(int j=n;j>=1;--j) { path[i][j]=0; maxHappy[i][j]=MIN; for(int k=0;k<=amount[j];++k) { if(i-k*space[j]>=0) { int temp=happy[j]*k+maxHappy[i-k*space[j]][j+1]; if(temp>maxHappy[i][j]) { maxHappy[i][j]=temp; path[i][j]=k; } } else { break; } } } } int back=maxHappy[v][1]; print(path,space,v,1,n); for(int i=0;i<v+1;++i) { delete []maxHappy[i]; } delete []maxHappy; return back; } int main() { int n,v,*amount,*happy,*space; cin>>n>>v; amount=new int[n+1]; happy=new int[n+1]; space=new int[n+1]; for(int i=1;i<n+1;++i) { cin>>amount[i]>>happy[i]>>space[i]; } cout<<getMaxHappy(amount,happy,space,n,v); return 0; }
相关文章推荐
- 动态规划----贪心的动态规划问题
- 动态规划与贪心算法之课程安排问题
- 数据结构 练习 19-活动选择问题的实现(动态规划 和 贪心)
- 《Thinking In Algorithm》14.由背包问题了解动态规划和贪心
- 动态规划基础之挖金矿问题
- ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
- acm动态规划之最长路问题---UVA103stocking boxes做题报告
- 动态规划——背包问题
- 动态规划DP问题分类和经典题型
- Leetcod-300_最长上升子序列LIS-基础动态规划问题-【C++】
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 动态规划问题
- 动态规划解决0-1背包问题
- 动态规划之硬币面值组合问题
- 简单动态规划问题分析
- 动态规划:和组成的问题
- 动态规划——矩形嵌套问题
- 动态规划——矩形嵌套问题
- 动态规划解最长公共子序列问题
- 动态规划之01背包问题