Description
Examples
input
100
output
1084
input
198
output
2108
Solution
混合背包
Code
#include <bits/stdc++.h>
using namespace std;
const int mac=1e5+10;
typedef long long ll;
const int inf=1e9+10;
int v[50],w[50],mk[50];
int dp[mac];
int main(int argc, char const *argv[])
{
int n;
scanf ("%d",&n);
v[8]=v[1]=1; w[1]=10; w[8]=18; mk[8]=1;
v[9]=v[2]=6; w[2]=60; w[9]=78; mk[9]=1;
v[10]=v[3]=28; w[3]=280; w[10]=308; mk[10]=1;
v[11]=v[4]=88; w[4]=880; w[11]=938; mk[11]=1;
v[12]=v[5]=198; w[5]=1980; w[12]=2108; mk[12]=1;
v[13]=v[6]=328; w[6]=3280; w[13]=3478; mk[13]=1;
v[14]=v[7]=648; w[7]=6480; w[14]=6868; mk[14]=1;
int num=14;
for (int i=1; i<=num; i++){
if (!mk[i]){
for (int j=v[i]; j<=n; j++)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
else {
for (int j=n; j>=v[i]; j--)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
printf ("%d\n",dp[n]);
return 0;
}