基本思路:
典型的01背包问题;
关键点:
后续总结;
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> #include<stack> using namespace std; const int maxn = 10010; int n, m; int vec[maxn]; int dp[maxn]; bool choice[maxn][maxn]; bool cmp(int a,int b) { return a > b; } int main() { cin >> n >> m; //int a; for (int i = 1; i <= n; i++) { cin >> vec[i]; } sort(vec + 1, vec + n + 1,cmp); //进行dp数组的初始化; //m相当于容量/价值; for (int i = 0; i <= m; i++) { //代表前0个元素的放不与不放都应该是0; dp[i] = 0; } for (int i = 1; i <= n; i++) { //前n个元素开始轮回放入; for (int v = m; v >= vec[i]; v--) { //如果可以放入; if (dp[v] <= dp[v - vec[i]] + vec[i]) { //如果放入更好; choice[i][v] = 1;//代表放入 dp[v] = max(dp[v], dp[v - vec[i]] + vec[i]);//不放入,或者放入; } else { choice[i][v] = 0;//代表不放入 } } } if (dp[m] != m) { //如果产生不了最优解; cout << "No Solution" << endl; } else { //如果有最优解; int k = n, num = 0, v = m; bool flag = true; while (k >= 0) { if (choice[k][v] == 1) { //进行选择; if (flag) { cout << vec[k]; flag = false; } else { cout <<" "<< vec[k]; } v -= vec[k]; } k--; } } return 0; }
1068 Find More Coins (30point(s)) 需要二刷 *动态规划 01背包问题
原文:https://www.cnblogs.com/songlinxuan/p/12357908.html