背包输出方案 Pro-Test Voting
http://202.120.106.94/onlinejudge/problemshow.php?pro_id=542
简单的概括下题意
有一个函数 f(x)
现有n个未知数x1 x2 x3....xn
sigma(xi)= S
求f(x1)+f(x2)+f(x3)+..+f(xn)的最大值
n s 的最大值都是100
这不就是泛化背包吗?每个物品的价值随着你分配给它的体积的变化而变化,最后求体积为S的背包能装进的物品的最大价值
注意相同答案时 要输出前面的体积尽可能大的方案,我很懒,可以参考 这里
View Code
#include<cstdio> #include<cstring> struct node{ double p,ip,k; }in[101]; int dp[101][101]; int pre[101][101]; int calc(int f,int id){ double fp=in[id].ip+(1.0*f/(10.1+f))*in[id].k; double tmp = fp*in[id].p/100.0; int t=int(tmp+0.5); if(t>in[id].p) return in[id].p; return t; } int main(){ int n,i,j,k,S,ca=1; while(scanf("%d%d",&S,&n),(S||n)){ for(i=1;i<=n;i++) scanf("%lf%lf%lf",&in[i].p,&in[i].ip,&in[i].k); memset(dp,0,sizeof(dp)); memset(pre,-1,sizeof(pre)); for(i=n;i>=1;i--){ for(j=0;j<=S;j++){ for(k=0;k<=j;k++){ int tmp=calc(j-k,i); if(dp[i+1][k]+tmp>dp[i][j]) { dp[i][j]=dp[i+1][k]+tmp; pre[i][j]=k; } } } } printf("Case %d: %d\n",ca++,dp[1][S]); int t=S;i=1; while(i!=n+1){ if(i!=1) printf(" "); printf("%d:%d",i-1,t-pre[i][t]); t=pre[i][t]; i++; } puts(""); } return 0; }