【动态规划1】动态规划的引入 P1616 疯狂的采药 AC代码(完全背包)+80分代码(01背包)
AC代码(完全背包):
状态转移方程:
if(j>=w[i])f[j]=max(f[j],f[j-w[i]]+v[i]);
AC代码(完全背包)如下:
#include <bits/stdc++.h>
#define maxn 10000010
#define LL long long
using namespace std;
LL f[maxn];
int w[maxn],v[maxn],t,m;
int main(){
int i,j;
scanf("%d%d",&t,&m);
for(i=1;i<=m;i++)scanf("%d%d",&w[i],&v[i]);
for(i=1;i<=m;i++)
for(j=1;j<=t;j++){
if(j>=w[i])f[j]=max(f[j],f[j-w[i]]+v[i]);
}
printf("%lld\n",f[t]);
return 0;
}
80分代码(01背包):
状态转移方程:
f[i%2][j]=max(f[i%2][j],f[(i-1)%2][j]);
if(j>=k*w[i])f[i%2][j]=max(f[i%2][j],f[(i-1)%2][j-k*w[i]]+k*v[i]);
80分代码(01背包)如下:
#include <bits/stdc++.h>
#define maxn 10000010
#define LL long long
using namespace std;
LL f[2][maxn];
int w[maxn],v[maxn],t,m;
int main(){
int i,j,k;
scanf("%d%d",&t,&m);
for(i=1;i<=m;i++)scanf("%d%d",&w[i],&v[i]);
for(i=1;i<=m;i++)
for(j=1;j<=t;j++)
for(k=0;k<=j/w[i];k++){
f[i%2][j]=max(f[i%2][j],f[(i-1)%2][j]);
if(j>=k*w[i])f[i%2][j]=max(f[i%2][j],f[(i-1)%2][j-k*w[i]]+k*v[i]);
}
printf("%lld\n",f[m%2][t]);
return 0;
}