思路,01背包解决,复杂度O(w*n)
/*
* 20171127
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
int n;
int num[400];
int dp[200][400];//w n
int main()
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
for(int i=1;i<=180;i++)
{
for(int j=1;j<=n;j++)
{
if(num[j]<=i)
{
dp[i][j] = std::max(dp[i-num[j]][j-1]+num[j],dp[i][j-1]);
}else
{
dp[i][j] = dp[i][j-1];
}
dp[i][j] = std::max(dp[i][j],dp[i-1][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=180;j+=10)
printf("%3d ",dp[j][i]);
printf("\n");
}
int ans = 0;
for(int i=1;i<=180;i++) ans = std::max(ans,dp[i][n]);
printf("%d\n",(180-ans)*2);
return 0;
}