洛谷P1164(0-1背包)

https://www.luogu.org/problemnew/show/P1164
dp(i,j)表示前i个菜刚好花j元钱的组合数,对于第i个菜,有要不要两种情况,则有状态转移方程:
\begin{equation} dp(i,j)= \begin{cases} dp(i-1,j)+dp(i-1,j-a[i]) & \text{j > a[i]}\\ dp(i-1,j)+1 & \text{j = a[i]} \end{cases} \end{equation}
数据是100*10000,不用滚动数组也行。
代码如下:

#include<iostream>
using namespace std;
int n, m;
int a[101];
int dp[10001];
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = m; j >= 1; j--) {
            if (a[i] < j) dp[j] = dp[j] + dp[j - a[i]];
            else if (a[i] == j) dp[j]++;
        }
    }
    cout << dp[m];
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。