华为OD机试【云短信平台优惠活动】
题目描述
某云短信厂商,为庆祝国庆,推出充值优惠活动。
现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数
输入描述
第一行客户预算M,其中 0<=M<=100
第二行给出售价表,P1,P2,... Pn,其中 1<=n<=100
Pi为充值i元获得的短信条数.
1<=Pi<=1000,1<=n<=100
输出描述
最多获得的短信条数
示例1
输入
6
10 20 30 40 60
输出
70
说明
分两次充值最优,1元、5元各充一次。总条数10+60=70
示例2
输入
18
1 2 30 40 60 84 70 80 90 150
输出
252
动态规划 完全背包问题
#include <bits/stdc++.h> using namespace std; int main() { int sum; cin >> sum; int tmp; vector<int>num;//存放每种套餐对应的短信数 vector<int>dp(sum+1,0); while (cin >> tmp) { num.push_back(tmp); if (cin.get() == '\n') break; } for (int i = 0; i < num.size(); i++) { for (int j = i+1; j <= sum; j++) { dp[j]=max(dp[j],dp[j-i-1]+num[i]);//j-(i+1)->i号套餐对应的费用为i+1 } } cout << dp[sum]; }