点评团准备展开一次大促销,促销中的每件商品,都有市场价和促销价,市场价和促销价的差就是用户省下的钱。由于本次活动的目标人群是点评团忠实用户,所以购买每件商品还需要一定量的金币,而金币就是根据用户的历史购买计算出来的。
给定一个用户的资金预算和金币预算,计算如何在不超过预算的情况下能省下最多的钱。
输入:首先三个整数,n: 促销商品的数量,m: 资金预算,k: 金币预算
其中0
接下来有n行,每行会有三个整数: p1, p2, g,分别代表该商品的市场价、促销价以及需要耗费的金币数量(p1 >= p2>0, g>0)
输出:一个数字,代表能省下的资金的最大值
注意:输入数据中会包含多条这样的测试数据
输入样例:
2 1 1
10 1 1
20 1 1
输出样例:
给定一个用户的资金预算和金币预算,计算如何在不超过预算的情况下能省下最多的钱。
输入:首先三个整数,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;
}