(点上面)
思路:
用01背包来做,方程就是 f [ j ] = f [ j − a [ i ] ] + 1 ; f[j]=f[j-a[i]]+1; f[j]=f[j−a[i]]+1;记得滚动数组不然会炸。
C o d e Code Code:
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int n,m,a[1001],f[1000001],head=1,tail=2;//head是上一周,tail是这一周
bool pd[1000005][3];//记录买了没
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
swap(head,tail);//滚动
for(int j=1;j<=m;j++)
pd[j][tail]=0;//先标记没有
for(int j=m;j>=a[i];j--)
{
if(f[j-a[i]]+1>f[j] && !pd[j-a[i]][head])//如果价钱少且没买过
{
f[j]=f[j-a[i]]+1;//转移
pd[j][tail]=1;//记录为买过
}
}
}
printf("%d",f[m]);//输出
}