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

点评团准备展开一次大促销,促销中的每件商品,都有市场价和促销价,市场价和促销价的差就是用户省下的钱。由于本次活动的目标人群是点评团忠实用户,所以购买每件商品还需要一定量的金币,而金币就是根据用户的历史购买计算出来的。
给定一个用户的资金预算和金币预算,计算如何在不超过预算的情况下能省下最多的钱。
输入:首先三个整数,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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值