听取WA声一片——混合背包20分

下面是代码:

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N = 205;
int c, n;
int w[N], v[N], k[N], f[N];

signed main()
{
    cin >> c >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> w[i] >> v[i] >> k[i];
        if (1 == k[i])
        {
            for (int j = c; j >= w[i]; j--)
            {
                f[j] = max(f[j], f[j - w[i]] + v[i]);
            }
        }
        else if (0 == k[i])
        {
            for (int j = w[i]; j <= c; j++)
            {
                f[j] = max(f[j], f[j - w[i]] + v[i]);
            }
        }
        else
        {
            for (int j = c; j >= w[i]; j--)
            {
                for (int l = 1; l < k[i] && l * w[i] <= j; l++)
                {
                    f[j] = max(f[j], f[j - l * w[i]] + l * v[i]);
                }
            }
        }
    }
    cout << f[c] << endl;
}
4 个赞

不是两个分支就行了,0:完全背包,否则01背包/多重背包

3 个赞

你上课发代码?

3 个赞

你跟我的错误一样

3 个赞

废话…课件里都有

3 个赞

你只要把多重背包里的换成这个:

for (int j =m; j >= w[i]; j--) 
				for(int k=1;k<=s[i];k++){
				if(j<k*w[i]) break;
				f[j]=max(f[j],f[j-k*w[i]]+k*v[i]);
}
			

你就能过了

4 个赞

确实是啊,可你。。。

4 个赞

对对对

4 个赞

有用的话给个解决方案

4 个赞
for(int j = v; j >= 0; j--)
			{
				for(int num = 0; num <= k[i]; num++)
				{
	               	if(j < c[i] * num)
	                {
	                    break;
	                }
					dp[j] = max(dp[j - c[i] * num] + w[i] * num, dp[j]);
				}
			}

这个多重背包代码,把01背包都容进去了

4 个赞

他问的是哪戳了

4 个赞

我是建议

3 个赞

减少代码量

3 个赞


so?

3 个赞

但是我的他只要复制一下就行了,而且便于理解

3 个赞

你替换成你定义的就行了

3 个赞

m就是c

3 个赞

你这是让他复制把

3 个赞

自己手打好啊

3 个赞

我都不知道换成什么,这些代码就这个2重循环

3 个赞