1. 程式人生 > >UVA 12563(Jin Ge Jin Qu hao)

UVA 12563(Jin Ge Jin Qu hao)

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)