采药
dp中的01背包 最经典的问题了吧
problem 1048
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int f[1100][1100];
int w[1100],v[1100];
int main()
{
int n,m;
cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>w[i]>>v[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(j>=w[i])
f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
else f[i][j]=f[i-1][j];
}
cout<<f[n][m];
return 0;
}
砝码称重
一看数据范围 果断搜索 qtmd dp
problem 2347
#include <iostream>
using namespace std;
int a[7];
int num[7];
int flag[1100];
int main()
{
int ans=0;
cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6];
int i[7];
for(i[1]=0;i[1]<=a[1];i[1]++)
for(i[2]=0;i[2]<=a[2];i[2]++)
for(i[3]=0;i[3]<=a[3];i[3]++)
for(i[4]=0;i[4]<=a[4];i[4]++)
for(i[5]=0;i[5]<=a[5];i[5]++)
for(i[6]=0;i[6]<=a[6];i[6]++)
{
int tot=i[1]*1+i[2]*2+i[3]*3+i[4]*5+i[5]*10+i[6]*20;
if(flag[tot]==0&&tot!=0)
{
flag[tot]=1;
ans++;
}
}
cout<<"Total="<<ans;
}
总分
完全背包
problem 2722
#include<cstdio>
#include<algorithm>
using namespace std;
int w[10300],c[10300],f[300010];
int v,n;
int main()
{
scanf("%d%d",&v,&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&c[i],&w[i]);
for(int i=1;i<=n;i++)
for(int j=w[i];j<=v;j++)
f[j]=max(f[j],f[j-w[i]]+c[i]);
printf("%d",f[v]);
return 0;
}