题目链接:
大意:对于每张发票,要么报销,要么不报销,0-1背包,张数即为背包;转移方程:f[j]=max(f[j],f[j-1]+v[i]);
一开始边界没考虑,导致输出结果为0.00;
View Code
1 #include2 #include 3 #include 4 using namespace std; 5 double price[1000]; 6 double dp[1000]; 7 8 int main(){ 9 double Q;10 int N,m,n;11 char ch;12 while(scanf("%lf%d",&Q,&N)!=EOF){13 if(N==0)break;14 memset(dp,0,sizeof(dp));15 memset(price,0,sizeof(price));16 n=0;17 for(int i=0;i 1000||p1>600||p2>600||p3>600||flag)continue;33 else price[n++]=sum;34 }35 sort(price,price+n);36 memset(dp,0,sizeof(dp));37 for(int i=0;i<=n;i++){38 for(int j=n;j>=1;j--){39 if(dp[j-1]+price[i]<=Q){40 dp[j]=max(dp[j],dp[j-1]+price[i]);41 }42 }43 }44 int k=0;45 for(int i=1;i<=n;i++){46 if(dp[k]