題意:存錢罐可以往里面放一些價值小的錢,但是時間久了就不知道里面有多少錢了,除非你打破它。現在給出空罐子的重量和最滿能裝到多重,然后給出每種硬幣的價值和重量,我們要在不打破它的情況下確認罐子里最少有多少錢。 for i 1~n; for j w[i]~weight; dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); 由于 http://blog.csdn.net/tbwood/article/details/22747215 這個大牛說過。當前狀態至于上一個狀態的當前位置和上一個狀態的前一個位置有關,可以用一維數組。 dp[i]=max(dp[j],dp[j-w[i]]+v[i]);
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int maxn = 10010;const int inf = 0x3f3f3f3f;int c[maxn];int v[maxn];int dp[maxn];int main(){ int T; cin>>T; while(T--) { int E,F; cin>>E>>F; int n; cin>>n; for(int i=1;i<=F-E;i++) dp[i]=inf; for(int i=1;i<=n;i++) cin>>c[i]>>v[i]; for(int i=1;i<=n;i++) { for(int j=v[i];j<=F-E;j++) { dp[j]=min(dp[j-v[i]]+c[i],dp[j]); } } if(dp[F-E]>=inf) cout<<"This is impossible."<<endl; else {新聞熱點
疑難解答