背包问题
突然意识到,商品可以重复购买和商品只能买一个两种问题其实只要改一行代码即可实现,即两个问题只要改一下刷表的顺序即可,对于逆序刷表那便是只能买一次,顺序刷表便是不限制购买次数,如下
//逆序
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <cmath>
#define int long long
using namespace std;
int N,M,w[3500],v[3500],dp[20000];
signed main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)cin>>w[i]>>v[i];
//有意识的采用把复杂问题转化成庞杂子问题的集合的思想就是动态规划思想,
//因为复杂问题有意识的分解成子问题后就可以实现子问题的防止重复求解的问题,
//而不分解则会间接做重复的工作
for(int j=0;j<=M;j++)
{
if(j>=w[1])dp[j]=v[1];else dp[j]=0;
}
for(int i=2;i<=N;i++)
{
for(int j=M;j>=0;j--)//调转此行既为顺序
{
if(j-w[i]>=0)
dp[j]=max(dp[j],v[i]+dp[j-w[i]]);
}
}
cout<<dp[M]<<endl;
return 0;
}