UVA 12563(Jin Ge Jin Qu hao)
阿新 • • 發佈:2017-05-13
case class 利用 i++ its 價值 con == 節省空間
開始認真學DP。我對滾動數組的理解是:後一個狀態可以由前一個狀態求得,便可以使用一維數組重復利用節省空間復雜度。
這個題要註意題目要求的前提,求次數可以看作重量為v[i]價值為1放入w-1的背包,歌曲就是重量和價值都是v[i],簡單的轉化。
#include <iostream> #include <bits/stdc++.h> using namespace std; const int maxn = 100000+10; int dp[maxn]; int v[maxn]; int cnt[maxn]; int main() { int t; cin >> t;int kase = 0; while(t--) { int n,w; cin >> n >> w; for(int i = 1 ; i <= n ; i ++) cin >> v[i]; printf("Case %d:",++kase); memset(dp,0,sizeof(dp)); memset(cnt,0,sizeof(cnt)); for(int i = 1 ; i <= n ; i++) {for(int j = w-1 ; j >= v[i] ; j--) { if(cnt[j] < cnt[j - v[i]]+1) { dp[j] = dp[j-v[i]]+v[i]; cnt[j] = cnt[j-v[i]]+1; } else if(cnt[j] == cnt[j-v[i]]+1) dp[j]= max(dp[j],dp[j-v[i]]+v[i]); } } cout << " " << cnt[w-1]+1 << " " << dp[w-1]+678 << endl; } return 0; }
UVA 12563(Jin Ge Jin Qu hao)