确定 状态为 dp[i][j]dp[i][j] 表示前ii个物品选或者不选 结果为j的方案数,
和当前状态有关,顺序滚动数组,其实就是个完全背包QWQ
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+10;
const int mod = 1e9+7;
int dp[MAXN];
int w[] = {1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
int n, sum;
int main(int argc, char const *argv[])
{
cin >> n;
dp[0] = 1;
for(int i = 0; i < 13; i++) {
for(int j = w[i]; j <= n; j++)
dp[j] = (dp[j] + dp[j-w[i]]) % mod;
}
cout << dp[n] << endl;
return 0;
}

本文介绍了一个典型的完全背包问题实现案例,使用动态规划方法解决给定物品集合中如何选择物品以达到特定价值的问题。通过滚动数组优化空间复杂度,并提供完整的C++代码实现。
305

被折叠的 条评论
为什么被折叠?



