1 条题解

  • 0
    @ 2024-11-2 21:49:03

    这是一道简单的动规题,定义 f[i][j]f[i][j] 为用前 ii 道菜用光 jj 元钱的办法总数,其状态转移方程如下:

    (1)if(j==第i道菜的价格)f[i][j]=f[i-1][j]+1;
    
    (2)if(j>第i道菜的价格) f[i][j]=f[i-1][j]+f[i-1][j-第i道菜的价格];
    
    (3)if(j<第i道菜的价格) f[i][j]=f[i-1][j];
    

    说的简单一些,这三个方程,每一个都是在吃与不吃之间抉择。若钱充足,办法总数就等于吃这道菜的办法数与不吃这道菜的办法数之和;若不充足,办法总数就只能承袭吃前 i1i-1 道菜的办法总数。依次递推,在最后,我们只要输出 f[n][m]f[n][m] 的值即可。

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<iostream>
    using namespace std;
    int a[101], f[101][10001] = { 0 };
    int main() {
    	int n,m;
    	cin >> n >> m;
    	for (int i = 1; i <= n; i++) {
    		cin >> a[i];
    	}
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= m; ++j)
    		{
    			if (j == a[i])f[i][j] = f[i - 1][j] + 1;
    			if (j > a[i]) f[i][j] = f[i - 1][j] + f[i - 1][j - a[i]];
    			if (j < a[i]) f[i][j] = f[i - 1][j];
    		}
    	}
    	cout << f[n][m];
    	return 0;
    }
    
    • 1

    信息

    ID
    129
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    98
    已通过
    16
    上传者