二维费用背包
scanf("%d%d%d",&n,&V,&M);
for(int i=0;i<n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
for(int j=V;j>=a;j--){
for(int k=M;k>=b;k--){
dp[j][k] = max(dp[j][k],dp[j-a][k-b] + c);
}
}
}
printf("%d\n",dp[V][M]);
scanf("%d%d%d",&V,&M,&n);
memset(dp,INF,sizeof(dp));
dp[0][0] = 0;
for(int i=0;i<n;i++){
scanf("%d%d%d",&v[i],&m[i],&w[i]);
}
for(int i=0;i<n;i++){
for(int j=V;j>=0;j--){
for(int k=M;k>=0;k--){
int aa = min(V,j + v[i]);
int bb = min(M,k + m[i]);
dp[aa][bb] = min(dp[aa][bb],dp[j][k] + w[i]);
}
}
}
printf("%d\n",dp[V][M]);
混合背包(把多重背包二进制转化)
int N,V;
int dp[205];
int type[205],v[205],w[205];
int cnt;
int main(){
scanf("%d%d",&V,&N);
cnt = 0;
for(int i=0;i<N;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c == 0){
type[cnt] = 0;
w[cnt] = a;
v[cnt++] = b;
}
else if(c == 1){
type[cnt] = 1;
w[cnt] = a;
v[cnt++] = b;
}
else {
for(int k=1;k<=c;k*=2){
c -= k;
type[cnt] = 1;
w[cnt] = a*k;
v[cnt++] = b*k;
}
if(c){
type[cnt] = 1;
w[cnt] = c*a;
v[cnt++] = c*b;
}
}
}
for(int i=0;i<cnt;i++){
if(type[i] == 1){
for(int j=V;j>=w[i];j--)
dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
}
else{
for(int j=w[i];j<=V;j++){
dp[j] = max(dp[j],dp[j-w[i]] + v[i]);
}
}
}
printf("%d\n",dp[V]);
return 0;
}
背包装满
int a[4] = {10,20,50,100};
int dp[1005],n;
int main(){
scanf("%d",&n);
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(int i=0;i<4;i++){
for(int j=a[i];j<=n;j++){
dp[j] += dp[j-a[i]];
}
}
printf("%d\n",dp[n]);
return 0;
}