每日一题 2023.10.22

1402. 做菜顺序 - 力扣(LeetCode)

法一:贪心

由于我们尽可能要把大的值加进去,所以先排序(从大到小)

然后 不断加如果sum>0  说明收益为正,加入结果中(之前加过的值都会再加一次--->乘法的作用)

简单的思路证明:

首先,我们取一个收益最大的S0

然后再取收益次大的S1 满足S1+2S0>S0 则加进去

同理 不断相加 满足条件则加 不满足跳过

class Solution {
public:
    int maxSatisfaction(vector& sat) {
        sort(sat.rbegin(),sat.rend());
        int ans=0;
        int sum=0;
        for(int i=0;i

法二:动态规划

0-1背包问题

获得最大收益,是最值问题,考虑动规。

状态:有没有选这道菜。

class Solution {
public:
    int maxSatisfaction(vector& sat) {
        int n=sat.size();
        vector> dp(n+1,vector(n+1,0));
        sort(sat.begin(),sat.end());
        int res=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                dp[i][j]=dp[i-1][j-1]+sat[i-1]*j;
                if(j

你可能感兴趣的:(每日一题,算法,leetcode,c++,数据结构,c语言)