哈理工OJ 1627 猪猪罐(完全背包)

来源:互联网 发布:golang http handler 编辑:程序博客网 时间:2024/06/13 02:33

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1627

猪猪罐
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 39(21 users) Total Accepted: 23(21 users) Rating: Special Judge: No
Description
ikki有一个小金库,这是一个猪猪罐,猪猪罐里面放了一些硬币。ikki知道了每种硬币的价值和重量,并且还知道空猪猪罐的重量,现在ikki想知道这个猪猪罐里至少放了价值为多少的硬币,她只能称出整个猪猪罐的总重量,你能帮她计算一下么?

Input
多组测试数据,第一行给出一个整数T表示测试数据的组数。

对于每组数据:

第一行输入两个正整数E、V,其中E表示空猪猪罐的重量,V表示放了硬币之后猪猪罐的总重量。(1<=E<=V<=10000)

第二行输入一个整数N表示硬币的种数。(1<=N<=50)

接下来的N行,每行两个整数v,w分别表示每种硬币的价值和重量。(1<=v<=50000,1<=w<=10000)

Output
对于每组数据输出猪猪罐中硬币价值可能的最小值,如果不存在则输出”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
60
100
Impossible

【题目分析】本题是一道完全背包的题目,一开始想了好久好久,因为这个背包和平常遇到的完全背包有区别,因为这个背包是知道了最终的重量,然后让你求是不是可以由某些硬币组成,假如可以由某些硬币组成的话,找出价值和最小的那一组硬币。可以一开始给dp数组置一个很大的数。
【AC代码】

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define INF 1000005struct node{    int val,cost;}a[55];int dp[10005];int main(){    int t,e,v,n;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&e,&v);        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d%d",&a[i].val,&a[i].cost);        }        v=v-e;        for(int i=1;i<=v;i++)        {            dp[i]=INF;        }        dp[0]=0;        for(int i=1;i<=n;i++)        {            for(int j=a[i].cost;j<=v;j++)            {                if(dp[j-a[i].cost]!=INF)                {                    dp[j]=min(dp[j-a[i].cost]+a[i].val,dp[j]);                }            }        }        if(dp[v]!=INF)        printf("%d\n",dp[v]);        else        printf("Impossible\n");    }    return 0;}
0 0
原创粉丝点击