寒冰王座
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3430 Accepted Submission(s): 1565
Problem Description
不死族的巫妖王发工资拉, 死亡骑士拿到一张N 元的钞票( 记住, 只有一张钞票), 为了防止自己在战斗中频繁的死掉, 他决定给自己买一些道具, 于是他来到了地精商店前.
死亡骑士:" 我要买道具!"
地精商人:" 我们这里有三种道具, 血瓶150 块一个, 魔法药200 块一个, 无敌药水350 块一个."
死亡骑士:" 好的, 给我一个血瓶."
说完他掏出那张N 元的大钞递给地精商人.
地精商人:" 我忘了提醒你了, 我们这里没有找客人钱的习惯的, 多的钱我们都当小费收了的, 嘿嘿."
死亡骑士:"......"
死亡骑士想, 与其把钱当小费送个他还不如自己多买一点道具, 反正以后都要买的, 早点买了放在家里也好, 但是要尽量少让他赚小费.
现在死亡骑士希望你能帮他计算一下, 最少他要给地精商人多少小费.
Input
输入数据的第一行是一个整数T(1<=T<=100), 代表测试数据的数量. 然后是T 行测试数据, 每个测试数据只包含一个正整数N(1<=N<=10000),N 代表死亡骑士手中钞票的面值.
注意: 地精商店只有题中描述的三种道具.
Output
对于每组测试数据, 请你输出死亡骑士最少要浪费多少钱给地精商人作为小费.
Sample Input
2
900
250
Sample Output
0
50
完全背包的练习题 ……
代码如下 :
#include<stdio.h> #include<string.h> inline int max (int a,int b) { return a>b?a:b; } int main() { int t,p[4],v[4],dp[10005]; int i,j,n; scanf("%d",&t); p[1]=v[1]=150; p[2]=v[2]=200; p[3]=v[3]=350; while (t--) { memset(dp,0,sizeof(dp)); scanf("%d",&n); for (i=1; i<=n; ++i) { for (j=1; j<=3; ++j) { if (i>=p[j]) dp[i]=max(dp[i],dp[i-p[j]]+v[j]); } } printf("%d/n",n-dp[n]); } return 0; }