题目描述
有个背包可承受重量N,现有T类物品
每类物品重量为Wi,价值为Vi ,每类物品的数量是无穷的,
这个背包可以装载物品的最大价值是多少?
输入
一行,N T 之间用空格隔开
后面t行,每行:重量Wi,价值Vi
输出
这个背包可以装载物品的最大价值
样例输入
100 5 77 92 22 22 29 87 50 46 99 90
样例输出
261
在背包1的基础上加循环,循环变量为同一物品选择的数量,要注意的是:
1:要从
(m - wi) / w[step]
循环到1(不然会超时)
2:循环内也要进行不选择的操作
上代码!!!
#include <bits/stdc++.h>
using namespace std;
int n, m, w[1001], v[1001], f[1001][1001], ans;
void dg(int step, int wi, int vi)
{
if (step > n)
{
ans = max(ans, vi);
return ;
}
else
{
for (int k = (m - wi) / w[step]; k >= 1; k--)
{
if (wi + w[step]*k <= m)
{
if (vi + v[step]*k > f[step][wi + w[step]*k])
{
f[step][wi + w[step]*k] = vi + v[step] * k;
dg(step + 1, wi + w[step]*k, vi + v[step]*k);
}
else
break;
if (vi >= f[step][wi])
{
f[step][wi] = vi;
dg(step + 1, wi, vi);
}
else
break;
}
else
break;
}
if (vi >= f[step][wi])
{
f[step][wi] = vi;
dg(step + 1, wi, vi);
}
}
}
main()
{
freopen("beibao2.in","r",stdin);
freopen("beibao2.out","w",stdout);
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &w[i], &v[i]);
dg(1, 0, 0);
printf("%d", ans);
}
记得三连哦么么哒~~~