小明逛超市
首先,
n
n
n和
m
m
m,
n
n
n代表有多少钱,
m
m
m代表有几种商品
接下来
m
m
m行,每行三个数,
x
、
y
、
z
x、y、z
x、y、z,
x
x
x代表单价,
y
y
y代表重要值,
z
z
z分
0
0
0和
1
1
1如果是
0
0
0,则代表此商品有无数
∞
∞
∞件,如果为
1
1
1,则代表此商品只有一件
求至多用
n
n
n元钱使得所买物品的重要值的和最大的值(好绕啊)
样例输入
4 5
5 3 0
5 3 1
4 4 0
2 3 0
3 2 1
样例输出
6
思路
01背包和完全背包
我这里没有用二进制优化,所以大家要自己写了
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,f[50005],x[1005],y[1005];
int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
scanf("%d%d",&m,&n);
int t=0;
for(int i=1;i<=n;i++)
{
t++;
int z;
scanf("%d%d%d",&x[t],&y[t],&z);
if(z==0)//如果是无限∞
{
for(int j=t+1;j<(t+m/x[t]);++j)//能放多少放多少
{
x[j]=x[t];
y[j]=y[t];
}
t+=m/x[t]-1;
}
}
n=t;
for(int i=1;i<=n;i++)//01背包
{
for(int k=m;k>=x[i];--k)
{
if(k-x[i]>=0)
{
int t=f[k-x[i]]+y[i];
f[k]=max(t,f[k]);
}
}
}
printf("%d",f[m]);
fclose(stdin);
fclose(stdout);
return 0;
}