梦屿千寻


私信TA

用户名:camilia

访问量:609

签 名:

等  级
排  名 55318
经  验 218
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业 计算机科学与技术

  自我简介:

TA的其他文章

贪吃的大嘴
浏览:272

解题思路:

此题一看就知道是一个多重背包题,只不过我们要求吃的小蛋糕数量。我们知道多重背包就是可以选物品n个,我们首先把01背包的程序的for循环写出来。然后在考虑多重的for如何写。

我们知道当物品i选择一次后就会选择下个物品了,那我们可以选在原来的基础上嵌入一个for用来表示当前选择了i物品的次数,由此我们dp[k]就等于dp[k - t[i]] + 1和dp[k]相互比较了。dp[k]表示当前我j的美味度时最少需要吃的小蛋糕数量。我们要去他们的最小值所以我们的初始化要尽可能的大,dp[0]=0一个边界值。

参考代码:

#include

#define INF 0x3fffffff

using namespace std;

int t[51];

int coin[51];

int dp[20002] = {0};

 int main(){

    int n;

    int m;

    int i, j, k;

   cin >> m >> n;

   for( i = 1; i<= n; i++ ) {

        cin >> t[i] >> coin[i];

    }

   for( i = 1; i <= m; i++ ) {

        dp[i] = INF;

    }

   dp[0] = 0;

    for( i = 1; i <= n; i++ )

        for( j = 1; j <= coin[i]; j++ )

            for( k = m; k >= t[i]; k-- ) {

                dp[k] = min( dp[k - t[i]] + 1, dp[k] );

            }

   if( dp[m] == INF ) cout << "><" << endl;

   else cout << dp[m] << endl;

   return 0;

}


 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区