1. 程式人生 > >動態規劃之完全揹包問題杭電1114

動態規劃之完全揹包問題杭電1114

#include <bits/stdc++.h>
using namespace std;
#define INF 0x7fffffff
#define maxn 10010
int main(){
  int dp[maxn],w[maxn],p[maxn];
  int e,n,f,i,R,j,T;
  cin>>T;                 //T組測試資料
  while(T--)
    {
    cin>>e>>f>>n;       
 //E 空的存錢罐的質量, F 存錢罐裝滿錢的重量
     for(i=1;i<=n;++i)
       {
      cin>>p[i]>>w[i]; //p[i]硬幣的價值 w[i]硬幣的重量
       }
      for(i=0;i<=10010;i++)
         {
          dp[i]=INF;             //將陣列初始化為無窮大,防止求最小值時取不到
         }
         dp[0]=0;
        for(i=1;i<=n;i++)
          {
              for(j=w[i];j<=f-e;++j)  //倒序輸出 由後一個推出前一個
               {
                if(dp[f-e]!=INF)    //資料輸入有效
                dp[j]=min(dp[j],dp[j-w[i]]+p[i]);   //不取第i個和取第i個價值的最小值
               }
          }
          if(dp[f-e]!=INF)
              cout<<"The minimum amount of money in the piggy-bank is "<<dp[f-e]<<"."<<endl;

          else
            cout<<"This is impossible."<<endl;
    }
    return 0;
}