輸入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 轉化...