小明逛超市
题目大意:
有一个大小为n的背包,和m件物品,每件物品都有自己的价格和价值还有个数,当个数为0时则为无限件,为1实则为1件,求最大的价值
样例输入
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背包组成,我就勤奋点把多重背包也打上了比赛是眼瞎,没看清题,以为有多重背包,但还是AC了,我们不用直接加一重循环的方法,用二进制优化,将5分为1,2,2,将8分为1,2,4,1
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,y,z,w,t,a[500000],b[500000],f[10000];
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=m;i++){scanf("%d %d %d",&x,&y,&z);if (!z) z=n/x;t=1;while (t<z){a[++w]=x*t;b[w]=y*t;z-=t;t*=2;}if (z){a[++w]=x*z;b[w]=y*z;}}for (int i=1;i<=w;i++)for (int j=n;j>=a[i];j--)f[j]=max(f[j-a[i]]+b[i],f[j]);printf("%d",f[n]);return 0;
}