哇呀哇呀,这周三门考试.........酸爽
总之希望这周的rp好一点点..
5.9
求三个硬币的面值,使得构成 1 到 n 面值得平均硬币数量最少
平均数量最少就要总数量最少,dp[i] 表示构成面额 i 需要的最少的硬币数量
然后肯定有 1 ,再枚举 另外两种硬币的面值
不过....好想说时间卡得好紧啊,都枚举到 n 会 T,打表发现面值不会超过 40,于是枚举到 40才水果
TwT/....................
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn = 505; 8 int dp[maxn],n; 9 const int INF = (1<<30)-1; 10 11 void solve(){ 12 int ans = INF,x = 2,y = 3; 13 for(int a1 = 2;a1 <= min(40,n);a1++){ 14 for(int a2 = a1+1;a2 <= min(40,n);a2++){ 15 if(a1+a2 > n) continue; 16 for(int i = 1;i <= n;i++) dp[i] = INF; 17 dp[0] = 0; 18 int tmp = 0; 19 for(int i = 1;i <= n;i++){ 20 if(i >= 1) dp[i] = min(dp[i],dp[i-1]); 21 if(i >= a1) dp[i] = min(dp[i],dp[i-a1]); 22 if(i >= a2) dp[i] = min(dp[i],dp[i-a2]); 23 dp[i] = dp[i]+1; 24 tmp += dp[i]; 25 // printf("a1 = %d a2 = %d dp[%d] = %d\n",a1,a2,i,dp[i]); 26 } 27 28 if(tmp < ans){ 29 ans = tmp; 30 x = a1;y = a2; 31 } 32 } 33 } 34 printf("1 %d %d\n",x,y); 35 } 36 37 int main(){ 38 int T; 39 scanf("%d",&T); 40 while(T--){ 41 scanf("%d",&n); 42 solve(); 43 } 44 return 0; 45 }
时间: 2024-11-10 09:32:43