1. 程式人生 > 實用技巧 >完全揹包--piggy-bank

完全揹包--piggy-bank

http://poj.org/problem?id=1384

完全揹包是物品的個數是無限的。

二維陣列:(這個題目用二維陣列會超時)

由於dp陣列初始化的問題,一直答案不對。

後面發現是:

 for(int i=0;i<=N;i++)
      dp[i][0]=0;

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include
<vector> #include<queue> #include<stack> #include<iomanip> using namespace std; #define INF 10000000 int P[505],W[505];//每種硬幣的金額,單個重量 int dp[505][10005]; int main() { int T; cin>>T; int E,F;//空的存錢罐的重量,裝了硬幣的存錢罐的重量 int N;//多少種不同的硬幣 while(T--) { cin>>E>>F; cin
>>N; int shiji=F-E; for(int i=1;i<=N;i++) cin>>P[i]>>W[i]; for(int i=0;i<=N;i++) for(int j=0;j<=shiji;j++) dp[i][j]=INF; for(int i=0;i<=N;i++) dp[i][0]=0; for(int i=1;i<=N;i++) for(int j=1;j<=shiji;j++) {
if(j<W[i]) dp[i][j]=dp[i-1][j]; else { dp[i][j]=min(dp[i-1][j],dp[i][j-W[i]]+P[i]); } } if(dp[N][shiji]<INF) cout<<"The minimum amount of money in the piggy-bank is "<<dp[N][shiji]<<"."<<endl; else cout<<"This is impossible."<<endl; } return 0; }

一維陣列:

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip> 
using namespace std; 
#define INF 10000000
int P[505],W[505];//每種硬幣的金額,單個重量 
int dp[10005]; 
int main() 
{
  int T;
  cin>>T;
  int E,F;//空的存錢罐的重量,裝了硬幣的存錢罐的重量 
  int N;//多少種不同的硬幣 
  while(T--)
  {
     cin>>E>>F;
     cin>>N;
     int shiji=F-E;
     for(int i=1;i<=N;i++)
      cin>>P[i]>>W[i];
     for(int j=0;j<=shiji;j++)
      dp[j]=INF;
      dp[0]=0;
     for(int i=1;i<=N;i++)
      for(int j=W[i];j<=shiji;j++)
      {
            dp[j]=min(dp[j],dp[j-W[i]]+P[i]);    
         
    }  
    if(dp[shiji]<INF)
     cout<<"The minimum amount of money in the piggy-bank is "<<dp[shiji]<<"."<<endl;
    else
     cout<<"This is impossible."<<endl;
  } 
   return 0;
}