POJ1384完全背包问题

题目大意:给你一个储蓄罐空的,和满的重量,然后给出各种硬币的价值和对应的重量,
要你估计出储蓄罐里面硬币价值和最小为多少,注意要保证重量和恰好为给出满的重量
解题思路:完全背包问题,只是求最小值,注意初始化的处理就可以。
已知储蓄罐满时的质量f以及空时质量e,有n种硬币,每种硬币的价值为p,质量为w,求该储蓄罐中的最少有多少钱?
这道题还要用到动态规划

 1 #include<stdio.h>
 2 #define inf 10000000
 3 #include<iostream>
 4 using namespace std;
 5 int main(){
 6     int n;
 7     scanf("%d",&n);
 8     while(n--){
 9         int i,empty,full,m;
10         int p[600],w[600],dp[10050];//p是价值,w是重量;
11         scanf("%d%d",&empty,&full);
12         full-=empty;
13         scanf("%d",&m);
14         for(i=0;i<m;i++)
15             scanf("%d%d",&p[i],&w[i]);
16         for(i=0;i<=full;i++)//将dp数组中的值全部变成inf;
17             dp[i]=inf;
18         dp[0]=0;
19         for(int k=0;k<m;k++)
20             for(i=0;i<=full;i++)
21                 if(i>=w[k])
22                     dp[i]=min(dp[i],dp[i-w[k]]+p[k]);//动态规划递推关系式,更新dp数组;dp[k-w[k]]表示的是增加k-w[k]重量的得到价值;
23         if(dp[full]==inf)
24             printf("This is impossible.\n");
25         else
26             printf("The minimum amount of money in the piggy-bank is %d.\n",dp[full]);
27     }
28     return 0;
29 }

 

posted @ 2016-03-17 20:44  OMG_By  阅读(149)  评论(0编辑  收藏  举报