0 1背包
#include<iostream>
#include<cstring>
#include<algorithm>
int dp[35000],val[35000],vol[35000];
using namespace std;
int main()
{
int n,v;
while(cin>>n>>v)
{
int ans=0;
memset(dp,0,sizeof(dp));
while(n--)
{
int a,b;
cin>>a>>b;
vol[ans]=a;
val[ans]=b;
ans++;
}
for(int i=0; i<ans; i++) //0 1背包,选不选问题
{
for(int j=v; j>=vol[i]; j--)
{
dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);
}
}
cout<<dp[v]<<endl;
}
return 0;
}
多重背包
#include<bits/stdc++.h>
int dp[1000],val[1000],vol[1000];
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
int n,v,ans=0;
cin>>v>>n;
while(n--)
{
int a,b,c;
cin>>a>>b>>c;
while(c--)//多重转化成0 1背包
{
vol[ans]=a;
val[ans]=b;
ans++;
}
}
for(int i=0;i<ans;i++)//0 1背包的动态规划
{
for(int j=v;j>=vol[i];j--)
{
dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);
}
}
cout<<dp[v]<<endl;
}
return 0;
}
完全背包
#include<stdio.h>
#include<string.h>
#include<algorithm>
int dp[100000],val[100000],vol[100000];
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int ans=0;
memset(dp,0,sizeof(dp));
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
val[ans]=a;
vol[ans]=b;
ans++;
}
int v;
scanf("%d",&v);
for(int i=0;i<ans;i++)
for(int j=vol[i];j<=v;j++)//完全背包,选不选,选几个
{
dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);
}
printf("%d\n",dp[v]);
}
return 0;
}