点评团促销 -动态规划 背包

来源:互联网 发布:ips显示器知乎 编辑:程序博客网 时间:2024/05/01 20:14
点评团准备展开一次大促销,促销中的每件商品,都有市场价和促销价,市场价和促销价的差就是用户省下的钱。由于本次活动的目标人群是点评团忠实用户,所以购买每件商品还需要一定量的金币,而金币就是根据用户的历史购买计算出来的。
给定一个用户的资金预算和金币预算,计算如何在不超过预算的情况下能省下最多的钱。
输入:首先三个整数,n: 促销商品的数量,m: 资金预算,k: 金币预算
其中0
接下来有n行,每行会有三个整数: p1, p2, g,分别代表该商品的市场价、促销价以及需要耗费的金币数量(p1 >= p2>0, g>0)
输出:一个数字,代表能省下的资金的最大值
注意:输入数据中会包含多条这样的测试数据
输入样例:
2 1 1
10 1 1
20 1 1
输出样例:

19

推荐指数:※※

来源:大众点评

这是一道二维背包问题,可是使用动态规划来借。考虑两个维度。

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;typedef struct Node{int p1;int p2;int g;int sale;}Node;int dp(int n,int m,int k,Node *w){int i,j,t;int **dp=new int* [m+1];for(i=0;i<=m;i++){dp[i]=new int[k+1];}for(i=0;i<=m;i++)for(j=0;j<=k;j++)dp[i][j]=0;for(t=0;t<n;t++){for(i=m;i>0;i--){for(j=k;j>0;j--){if(w[t].p2<=i&&w[t].g<=j){dp[i][j]=max(dp[i-w[t].p2][j-w[t].g]+w[t].sale,dp[i][j]);}}}}return dp[m][k];}int main(){int n,m,k,i,j;while(scanf("%d%d%d",&n,&m,&k)!=EOF){Node *w=new Node [n];for(i=0;i<n;i++){scanf("%d%d%d",&w[i].p1,&w[i].p2,&w[i].g);w[i].sale=w[i].p1-w[i].p2;}int largest= dp( n,m,k,w);printf("%d\n",largest);}return 0;}