1. Descripción del título
Especificación de entrada:
Especificación de salida:
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;
}