PAT L3 001 湊零錢((揹包 路徑記錄)

2021-07-28 09:16:17 字數 1518 閱讀 9304

4枚來自各個星球的硬幣,需要請你幫她盤算一下,是否可能精確湊出要付的款額。

輸入樣例1:

8 9

5 9 8 7 2 3 4 1

輸出樣例1:
1 3 5
輸入樣例2:
4 8

7 2 4 3

輸出樣例2:
no solution

ps :及判斷是否能夠裝滿揹包,能的話輸出裝的物品的價值序列。我們可以用乙個pre記錄當前狀態由那個轉移而來,另乙個記錄當前狀態的價值。

(揹包&路徑記錄)

#include#include#include#include#include#include#include#include#define ll int

#define inf 0x3f3f3f3f

#define eps 1e-8

#include#define ls l,mid,rt<<1

#define rs mid+1,r,rt<<1|1

#define ll __int64

using namespace std;

int arr[10100],dp[10100],val[10100],pre[10100];

void dfs(int u)

dfs(pre[u]);

printf(" %d",val[u]);

}int main()

sort(arr,arr+n);

memset(dp,-inf,sizeof(dp));

memset(pre,-1,sizeof(pre));

dp[0] = 0;

for(i = 0;i < n;++ i)}}

if(dp[m]>0)

else

puts("no solution");

}return 0;

}

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

const int inf=0x3f3f3f3f;

int a[10005];

int n,m,ans[10005];

int flag,cnt;

void dfs(int k,int sum1,int sum2)

if(sum1+sum2=n) return;

if(sum1+a[k]<=m)

dfs(k+1,sum1,sum2-a[k]);

if(flag) return ;

}else return ;

}int main()

else printf("no solution\n");

}return 0;

}

L3 001 湊零錢 (揹包輸出路徑)

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v1...

L3 001 湊零錢 (01揹包)

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v...

L3 001 湊零錢(揹包dp,輸出路徑)

輸入格式 輸入第一行給出兩個正整數 n 104 是硬幣的總個數,m 102 是韓梅梅要付的款額。第二行給出n枚硬幣的正整數面值。數字間以空格分隔。輸出格式 在一行中輸出硬幣的面值 v1 v2 vk,滿足條件 v1 v2 vk m。數字間以1個空格分隔,行首尾不得有多餘空格。若解不唯一,則輸出最小序列...