基本思想:
第一次见到01背包中的最小值背包问题,即相同容量下装满所能有的最小值,如果没法装满,则dp[m]=MAX;
具体思想和最大值01背包思想有出入;
最大值背包思想是从0开始,并且从后向前更新;
而最小值背包思想dp[0]作为边界,剩下初始化为最大值,遍历更新方式和最大值背包问题方式相同;
dp数组更新的状态转移方程为(这里题目中默认权值全部为1):
dp[j] = min(dp[j], dp[j - w[i]] + 1);
关键点:
无;
#include<iostream> #include<vector> #include<algorithm> using namespace std; const int maxn = 110; const int cap = 21; const int INF = 10000000; int m, n; int dp[maxn]; int w[cap]; int main() { while (cin >> m) { cin >> n; for (int i = 1; i <= n; i++) { cin >> w[i]; } fill(dp, dp + maxn, INF); dp[0] = 0; for (int i = 1; i <= n; i++) { for (int j = m; j >= w[i]; j--) { dp[j] = min(dp[j], dp[j - w[i]] + 1); } } if (dp[m] == INF) cout << 0 << endl; else { cout << dp[m] << endl; } } }
原文:https://www.cnblogs.com/songlinxuan/p/12634047.html