PAT Grado A 1068 Encuentra más monedas (30 puntos) | Implementación de C ++

1. Descripción del título

Enlace del título original
Inserte la descripción de la imagen aquí

Especificación de entrada:

Inserte la descripción de la imagen aquí

Especificación de salida:

Inserte la descripción de la imagen aquí

Entrada de muestra 1:

8 9
5 9 8 7 2 3 4 1

Salida de muestra 1:

1 3 5

Entrada de muestra 2:

4 8
7 2 4 3

Salida de muestra 2:

Sin solución

Dos ideas para resolver problemas

01 El problema de la mochila es un problema de programación dinámica, dado que el autor no tiene un buen conocimiento de este conocimiento, le sugiero que lea la descripción del problema de la mochila en "Notas de algoritmo".

Tres, código de CA

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010;
const int maxv = 110;
int w[maxn], dp[maxv] = {
    
    0};  //w[i]为钱币的价值
bool choice[maxn][maxv], flag[maxn];
bool cmp(int a, int b) 
{
    
    return a > b; }//从大到小排序
int main() 
{
    
    
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
    sort(w + 1, w + n + 1, cmp);  //逆序排列
    for(int i = 1; i <= n; i++) 
    {
    
    
        for(int v = m; v >= w[i]; v--) 
        {
    
    
          	dp[v] = max(dp[v], dp[v-w[i]]+w[i]);    //状态转移方程
            if(dp[v] == dp[v-w[i]]+w[i])
              choice[i][v] = 1;
          	else
              choice[i][v] = 0;
        }
    }
    if(dp[m] != m) printf("No Solution");  //无解
    else 
    {
    
    
        //记录最优路径
        int k = n, num = 0, v = m;
        while(k >= 0) 
        {
    
    
            if(choice[k][v] == 1) 
            {
    
    
                flag[k] = true;
                v -= w[k];
                num++;
            }
            else flag[k] = false;
            k--;
        }
        //输出方案
        for(int i = n; i >= 1; i--) 
        {
    
    
            if(flag[i] == true) 
            {
    
    
                printf("%d", w[i]);
                num--;
                if(num > 0) printf(" ");
            }
        }
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_42393947/article/details/108706749
Recomendado
Clasificación