比賽18 揹包

2021-08-09 03:42:08 字數 3412 閱讀 9481

輸入n,k,下面是n個數和k個數,讓k個數都選擇n個數中的乙個(可以重複),相乘,問所有乘積之和為0的方法有幾種

記憶化搜尋

#include

#include

#define ll long long

using

namespace

std;

ll n,m,dp[25][40010],l[25],g[25];

ll dfs(ll now,ll mask)

if(dp[now][mask+20000]!=-1)

ll result=0,i;

for(i=1;i<=n;i++)

dp[now][mask+20000]=result;

return result;

}int main()

for(j=1;j<=m;j++)

for(i=1;i<=22;i++)

}cout

<1,0);

}

輸入n和n個數,分成三組,輸出以每組之和為邊長所組成的三角形面積的最大值*100(答案為整數),若無法組成乙個三角形則輸出-1.

用窮舉的方法列出分完組後第一,二條邊的所有情況,再用海**式計算並比較

#include

#include

#include

#include

#include

#define db double

#define ll long long

using

namespace

std;

int n,l[50],ans,zh[50];

db c;

bool dp[42][605][605];

int mj(int x,int y,int z)

int main()

sort(l+1,l+n+1);

for(i=1;i<=n;i++)

// cout=(db)c/2.0)

dp[0][0][0]=true;

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

c/=2;

int ans=0;

for(i=1;i<=600;i++)}}

cout

《多重揹包,輸入v和n並用矩陣輸入n個物品取i個所獲得的快樂度(每個物品的大小相同),輸出最大快樂度

列舉每乙個物品並且列舉個數,比較即可

#include

#define ll long long

#define n

using

namespace

std;

ll n,m,a[110][110],dp[110];

int main()

}memset(dp,0,sizeof(dp));

for(i=1;i<=m;i++)}}

cout

《買一些東西。要使用來支付的硬幣數量加上在支付中收到的硬幣的數量之和最小。輸出最小數量

輸入擁有的貨幣種類(商店有無限的貨幣)和個數,無法支付則輸出-1.

支付的錢-需要的錢=找零

因此列舉找零,故付費為多重揹包,找零為完全揹包

若直接用多重揹包會t,故用倍增(1,2,4,8)優化,轉化為01揹包

#include

#include

#include

#include

#define ll long long

#define n 10000

#define m 1000000000

using

namespace

std;

ll m,n,sl[1010],change[1010],dp[20010],dp2[10010],ans=m,jl[10010],kk[1010];

bool p[10010];

void shch(ll u)

n--;

}void fj(int u)

for(i=1;i<=cs-1;i++)

change[n+1]=change[u]*tt;

kk[n+1]=tt;

n++;

shch(u);

}ll dfs2(ll now)

dp2[now]=result;

return result;

}int main()

for(i=1;i<=n;i++)

for(i=n;i>=1;i--)

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

dp2[0]=0;

for(i=1;i<=n;i++)

ll zzz=n;

for(i=1;i<=1000;i++) kk[i]=1;

for(i=1;i<=zzz;i++)

for(i=1;i<=m+n;i++) dp[i]=m;

dp[0]=0;

for(i=1;i<=n;i++)

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

if(ans!=m) cout

cout

<<-1;

}

從樹的頂點1開始,最多走k步,每乙個點有乙個權值,問所能達到的最大權值

抓住樹的特點每乙個節點都可視為它和它所有子樹所組成的一棵樹

一共三種走法:

1.以改點為起點向下走一圈再到它的乙個子樹上走一圈(返回,多走兩步(它到子樹,子樹到它))

2.以改點為起點向下走一圈(不經那一棵子樹)再到那棵子樹走且不返回(不返回,多走1步(它到子樹))

3.到那棵子樹走一圈,再到另一棵走且不返回(不返回,多走兩步(它到子樹,子樹到它))

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,k,val[110],dp[2][110][210];//表示是否返回,當前位置和剩餘步數.

bool vis[110];

vector

bn[110];

void dfs(int now)

for(i=0;iif(vis[to]) continue;

dfs(to);

for(j=k;j>=0;j--)

//三條可能路徑}}

}int main()

for(i=1;i<=100;i++)

for(i=1;i<=n-1;i++)

memset(dp,0,sizeof(dp));

memset(vis,false,sizeof(vis));

dfs(1);

printf("%d\n",dp[1][1][k]);

}}

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...