【20221215】【每日一题】爬楼梯进阶(ACM模式)
创始人
2024-04-23 22:35:13
0

在爬楼梯的基础上,改为一次可以爬1阶、2阶、...一直到m阶,问一共有多少种办法爬到楼顶?


思路:这是一个完全背包问题,因为爬完一阶后,还可以再爬一阶,可以重复取;

动规五部曲

1、dp数组下标及其含义:背包容量为j的背包一共有dp[j]种办法装满;

2、递推关系式:背包装满的问题、dp[j]+=dp[j-nums[i]];

3、初始化:dp[0]=1,其余为0;

4、遍历顺序:归根到底还是排序问题,不同的顺序可以视为不同的方法,先背包后物品,背包为正序。

5、举例验证dp数组。


1、getline使用方法:getline(<字符数组chs>,<读取字符的个数n>,<终止符>)

2、stoi:string to int

3、find_if用法:按功能查找元素  

  • find_if( iterator beg, iterator end, _pred)
  • 按值查找元素,找到的话返回指定位置的迭代器,找不到则返回结束迭代器位置
  • beg :开始迭代器
  • end :结束迭代器
  • _pred :函数或者谓词 (返回bool类型的仿函数)

例子:

class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};void test1()
{vector v;for (int i = 0; i < 10; i++){v.push_back(i);}vector::iterator pos = find_if(v.begin(), v.end(), GreaterFive());if (pos == v.end()){cout << "未找到!" << endl;}else{cout << "找到>5的数字:" << *pos << endl;}
}

 

#include 
#include 
#include 
#include 
using namespace std;
class Solution {
public:int combinationSum4(vector& nums, int target) {//初始化vector dp(target + 1, 0);dp[0] = 1;//遍历顺序 由于要求为排列结果,所以先背包、后物品for (int j = 0; j <= target; j++){for (int i = 0; i < nums.size(); i++){if (j >= nums[i] && dp[j] < INT_MAX - dp[j - nums[i]])  dp[j] += dp[j - nums[i]];}}return dp[target];}
};void trimLeftTrailingSpaces(string& input) {input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {return !isspace(ch);}));
}void trimRightTrailingSpaces(string& input) {input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {return !isspace(ch);}).base(), input.end());
}vector stringToIntegerVector(string input) {vector output;trimLeftTrailingSpaces(input);trimRightTrailingSpaces(input);input = input.substr(1, input.length() - 2);stringstream ss(input);ss.str(input);string item;char delim = ',';while (getline(ss, item, delim)) {output.push_back(stoi(item));}return output;
}int stringToInteger(string input) {return stoi(input);
}int main() {string line;while (getline(cin, line)) {vector nums = stringToIntegerVector(line);getline(cin, line);int target = stringToInteger(line);int ret = Solution().combinationSum4(nums, target);string out = to_string(ret);cout << out << endl;}return 0;
}

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...