poj 1252 完全背包
2012-11-29 17:19
363 查看
题意:
六种钱币,数量不限,问组成1~100钱币的最小个数加和/100的值,以及这里边最大的值。而且,可以找钱,例如:我用一百,找我10块,那么如果我这个90的值比一开始不找钱90的值小,那么可以替代。
题解:
背包一次,dp[i]存储价钱为i时最小钱币个数。然后暴力找:二重循环。每次找最小的。
六种钱币,数量不限,问组成1~100钱币的最小个数加和/100的值,以及这里边最大的值。而且,可以找钱,例如:我用一百,找我10块,那么如果我这个90的值比一开始不找钱90的值小,那么可以替代。
题解:
背包一次,dp[i]存储价钱为i时最小钱币个数。然后暴力找:二重循环。每次找最小的。
#include<stdio.h> #include<string.h> #define Max 2000 int dp[2100],value[10],cas,dp1[2100]; int min(int a,int b){ return a<b?a:b; } int main(){ scanf("%d",&cas); while(cas--){ for(int i=1;i<=6;i++){ scanf("%d",&value[i]); } for(int i=1;i<2000;i++){ dp[i]=Max; dp1[i]=Max; } dp[0]=0; dp1[0]=0; for(int i=1;i<=6;i++){ for(int j=value[i];j<=2000;j++){ dp[j]=min(dp[j],dp[j-value[i]]+1); dp1[j]=dp[j]; } } for(int i=1;i<2000;i++){ for(int j=1;j<i;j++){ if(i-j<=100&&i-j>=0){ dp1[i-j]=min(dp1[i-j],dp[i]+dp[j]); } } } int max=0; double sum=0; for(int i=1;i<=100;i++){ if(dp1[i]>max){ max=dp1[i]; } sum+=dp1[i]; } printf("%.2lf %d\n",sum/100,max); } return 0; }
相关文章推荐
- poj1252-完全背包(正负背包)
- poj 1252_完全背包
- poj 1252完全背包 凑纸币
- poj 1252 Euro Efficiency 正负完全背包
- 背包问题--POJ 1252 Euro Efficiency【完全背包】
- poj 1252 Euro Efficiency(多次完全背包)
- 【DP】POJ 1252 完全背包
- 【DP】POJ 1252 完全背包
- poj 1252 Euro Efficiency(多次完全背包)
- poj 1252 Euro Efficiency 正负完全背包
- POJ 1252 Euro Efficiency(BFS or 完全背包)
- POJ 1252 Euro Efficiency【完全背包正负】
- POJ 1252 Euro Efficiency(完全背包变型)
- poj 1252 完全背包
- POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)
- poj 1252 Euro Efficiency(完全背包)
- poj 1252 zoj 1558 Euro Efficiency 完全背包
- POJ 1252 Euro Efficiency(完全背包变型)
- poj 1252(完全背包)
- 完全背包的变形POJ1252