储蓄罐问题

yixiayizi yixiayizi 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
Description

储蓄罐中有一定的金币,但数量未知.现要求在不破坏储蓄罐的前提下估计总价值.
已知储蓄罐当前的重量,空储蓄罐的重量,以及储蓄罐中的货币种类及对应的价值和重量.
你要做的任务就是根据给定的信息,估计储蓄罐中的最小价值量.


Input

第一行输入T,表明该问题有T组实例;
每组实例输入正整数E(空储蓄罐重量),F(当前储蓄罐重量);( 1 <= E <= F <= 10000 )
接着输入正整数N(货币种类数);( 1 <= N <= 500 )
接下来输入N行,每一行输入P,W,分别表示该种货币的价值和重量.( 1 <= P <= 50000, 1 <= W <= 10000 )


Output

如果该实例"可实现的"(根据给定的储蓄罐重量,经过计算不可能由该组实例的货币来实现的话,即确定该组实例为"不可实现的"),为每一个实例输出"The minimum amount of money in the piggy-bank is X.".其中"X"表示该实例的最小价值量.
如果该实例"不可实现的",则输出一行"This is impossible.".


Sample Input


3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4


Sample Output


The minimum amount of money in the piggy-bank is 60.
The minimum amount of money in the piggy-bank is 100.
This is impossible.

我的程序:

#include<iostream>
using namespace std ;

typedef struct node
{
int p , w ;
double info ;
}node;

int cmp ( const void * a ,const void * b )
{
node *c = (node *) a ;
node *d = (node *) b ;
if ( c->info > d->info )
return 1 ;
else
if ( c->info < d->info )
return -1 ;
else
{
if ( c->w > d->w )
return 1 ;
else
return -1;
}
}


int main ()
{
int T , E , F , N , i , x ,tw,ff;
node st[500];
while ( cin >> T )
{
while ( T > 0 )
{
cin >> E >> F ;
tw = F - E ;
x = 0 ;
cin >> N ;
for ( i = 0 ; i < N ; i ++ )
{
cin >> st[i].p >> st[i].w ;
st[i].info = ( double ) st[i].p / (double ) st[i].w ;
}
qsort((void *)st , N , sizeof ( st[0] ) , cmp ) ;
while (1)
{
for ( i = 0 ; i < N && tw > 0 ; i ++ )
{

while ( st[i].w <= tw )
{
tw = tw - st[i].w ;
x = x + st[i].p ;
}

}
if ( tw == 0 )
{
ff = 1 ;
break ;
}
if ( tw < 0 )
{
tw = tw + st[i - 1].w ;
x = x - st[i].p ;
continue ;
}
if ( i == N )
{
ff = 0 ;
break ;
}
}
if ( ff == 1 )
cout << "The minimum amount of money in the piggy-bank is " << x << '.' << endl ;
else
cout << "This is impossible." << endl ;
T -- ;
}
}
return 0 ;
}


题目给的数据通过了,但是服务器上的过不去,请教问题出在哪里了?
...全文
评论 1
收藏 已收藏
分享
返回顶部
yixiayizi
C++ 语言 65,214 成员 250,514 内容