模板:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int w[3405],v[3405];
int dp[12888];
int main()
{
int n,m;
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i];
memset(dp,0,sizeof(dp));
int sum = 0;
for(i=1;i<=n;i++){
if(i>1) sum += w[i-1];//剪枝优化
for(int j=m ;j>=max(sum,w[i]);j--)//剪枝优化
dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
}
cout<<dp[m]<<endl;;
}
return 0;
}
背包九讲中作者给出了代码中的常数优化思路:
个人理解:如果当前状态时存在 , 说明不需要比较了,因为后面的可以全放包里,包够大!!!