AT4526 Knapsack 2
AT4526 Knapsack 2
前置知识:01背包
最经典的一道题:有一个
设
那么这个方程的含义是什么呢?其实
1.取第
2.不取该件物品,那么就是继承上一个的最优解就可以了
最后在这两种情况之中取最优值 就是当前的
01背包的优化:
由上文可知,01背包的转移方程是
其中的
这个方程的意思是:
练习题目 AT4525 P1164
所以对于这一题来说,数据太大了 ,
设
1.拿第
2.不拿第
由于数据问题,应该考虑压维
整理可得:
所以到这里,这道题就大体完成了,下面来看完整代码:
#include<bits/stdc++.h>
using namespace std;
int f[114514],n,m,w[114],v[114];
int main()
{
int n,m;
cin>>n>>m;
int maxx=n*1000;//最坏的情况 开大开小都不行
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i];
memset(f,0x3f3f,sizeof(f));// 初始值最大
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=maxx;j>=v[i];j--)
{
f[j]=min(f[j],f[j-v[i]]+w[i]);
}
}
for(int i=maxx;i;i--)
{
if(f[i]<=m)//如果当前的价值是小于或者等于它的,那么他就是最优解了
{
cout<<i<<endl;
return 0;
}
}
return 0;
}