C :动态编程,给定3个可能的操作

C++: Dynamic programming, given 3 possible operations

本文关键字:操作 3个 给定 动态 编程      更新时间:2023-10-16

问题:所以问题是这样的:我有n个数字。对于长度为n的每个数字x,我可以执行3个操作:1。如果x是2个倍数,则将x除以2。2。如果x是3的倍数,则将其除以3,将其除以3。3。减去。1来自X。找到最小操作数量以使x = 0。

输入:第1行:n行2:n数字的数组x

输出:第1行:将X1减少到0的操作数量。

那么我应该怎么做?

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int N;
    cin >> N;
    for (int i = 0; i < N; i++){
        int A, count = 0;
        cin >> A;
        while (A > 0){
            if (A%2 == 0){
                A /= 2;
                count++;
            }
            else if (A%3 == 0){
                A /= 3;
                count++;
            }
            else{
                A--;
                count++;
            }
        }
    cout << count << "n";
  }
}

我当前想到的这个代码在某些情况下不起作用(这意味着我没有输出所需的解决方案,并且代码是工作代码),例如XI =10。-1,然后/2,然后/2 -1,因此是5个操作。但是,最佳是10 -1,/3,/3,然后-1,即4个操作。有人知道如何解决这个问题的解决方案?谢谢!任何帮助都将不胜感激!

您说了动态编程:

std::vector<int> v{0};
for (int i = 1; i != N + 1; ++i) {
    v.push_back(v.back() + 1);
    if (i % 2 == 0) {
        v.back() = std::min(v.back(), v[i / 2] + 1);
    }
    if (i % 3 == 0) {
        v.back() = std::min(v.back(), v[i / 3] + 1);
    }
}
return v.back();