小明逛超市
题目大意
他知道了每样物品的单价,以及他对每样物品的需求度(对于相同的物品,需求度可以累加),他想要花费至多N元钱使得他对所买物品的需求度和最大。
输入样例
4 5
5 3 0
5 3 1
4 4 0
2 3 0
3 2 1
输出样例
6
样例解释
买需求度为3的物品两个,耗费2×2=4元,获得3×2=6的需求度
数据范围
对于50%的数据,1≤m≤20
对于100%的数据,1≤m≤100,0≤n≤10000,1≤y≤1000
思路
这道题就是一道背包。
分两种,只能买一次那个就用01背包,不然就用完全背包。
然后就可以了。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,y,z,f[10001];
int main()
{
//freopen("c.in","r",stdin);
//freopen("c.out","w",stdout);
scanf("%d%d",&n,&m);//读入
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);//读入
if (z)//01背包的部分
for (int j=n;j>=x;j--)
f[j]=max(f[j],f[j-x]+y);
else//完全背包的部分
for (int j=x;j<=n;j++)
f[j]=max(f[j],f[j-x]+y);
}
printf("%d",f[n]);//输出
//fclose(stdin);
//fclose(stdout);
return 0;
}