题目大意:
T3:就是求出他想要花费至多N元钱使得他对所买物品的需求度和最大。
输入
两个正整数n,m分别表示他所有的钱数和物品种类数。接下来m行每行三个正整数x,y,z表示单价为x的物品,他对该物品的需求度为y,z=0时表示该物品为无限量,z=1时表述该物品只有1件。
输出
一个正整数,表示至多用n元钱使得他对所买物品的需求度和最大的值
样例输入
4 5
5 3 0
5 3 1
4 4 0
2 3 0
3 2 1
样例输出
6
【样例解释】
买需求度为3的物品两个,耗费22=4元,获得32=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,ans[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==1)//判断z==1
{
for(int j=n;j>=x;j--)
ans[j]=max(ans[j],ans[j-x]+y);//01背包
}
else
{
for(int j=x;j<=n;j++)
ans[j]=max(ans[j],ans[j-x]+y); //完全背包
}
}
printf("%d",ans[n]);//输出。
fclose(stdin);
fclose(stdout);
return 0;
}