题目的意思就是要其自动贩卖机买可乐.一瓶8块.硬币面值有1,5,10;
给出你要买的瓶数,和1 , 5, 10 的硬币的个数.要问最少投币几次,买完可乐.
你买可乐可以选择,投1个10元,找回2个一元(投币一次)
投两个5元,找回2个一元(投币两次)
投一个5元,三个1元 (投币四次)
投一个10元 , 三个1元 ,找回一个5元 (投币4次)
投8个一元 (投币8次)
然后把各个情况递归去dp就行了;
AC代码:
#include<stdio.h>
#include<string.h>
int c,n1,n5,n10;
const int INF = 0x3f3f3f3f;
int f[850][100][50];
int min(int a ,int b ,int c ,int d , int e) {
int w = a < b ? a : b;
int ww = c < d ? c : d;
int www = w < ww ? w : ww;
return www < e ? www : e;
}
int dp(int c ,int n1 , int n5 ,int n10) {
if(f[n1][n5][n10] != -1)
return f[n1][n5][n10];
if(c == 0)
return 0;
int temp1 ,temp2 ,temp3,temp4,temp5;
temp1 = temp2 = temp3 = temp4 = temp5 = INF;
if(n10 >= 1)
temp1 = dp(c - 1 ,n1 + 2, n5 , n10 - 1) + 1;
if(n5 >= 2)
temp2 = dp(c - 1 ,n1 + 2, n5 - 2 , n10) + 2;
if(n1 >= 3 && n5 >= 1)
temp3 = dp(c - 1 ,n1 - 3, n5 - 1 , n10) + 4;
if(n1 >= 8)
temp4 = dp(c - 1 ,n1 - 8, n5 , n10) + 8;
if(n10 >= 1 && n1 >=3)
temp5 = dp(c - 1 ,n1 - 3 , n5 + 1 ,n10 - 1) + 4;
f[n1][n5][n10] = min(temp1 ,temp2 ,temp3 ,temp4 ,temp5);
return f[n1][n5][n10];
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d%d%d",&c,&n1,&n5,&n10);
memset(f , -1 , sizeof(f));
printf("%d\n",dp(c ,n1,n5,n10));
}
}